Project Euler # 5 Java -suggestions, чтобы сделать мой код немного более чистым

102
15

Поэтому я прошел и переделал свой код. Я ранее пробовал метод грубой силы, который работал, но потребовалось около 20 минут, чтобы получить правильный ответ. Код, который у меня сейчас, делает это почти мгновенно, если найти основное разложение каждого числа 1-20 и взять наибольшее количество простых чисел среди всех разложений, для каждого простого числа ниже 20. Он делает все это прекрасно, но я был заинтересован в том, что, если бы я хотел найти наименьшее количество кратных между разными диапазонами чисел, скажем, 1-30 или даже более восторженным, 10-30? С кодом, который у меня есть сейчас, было бы невозможно без изменения моего кода.

package number_5;

public class Number5 {

public static void main(String[] args) {
long smallestnumber = 0;
boolean exitloop = false;

int finalTwo = 0;
int finalThree = 0;
int finalFive = 0;
int finalSeven = 0;
int finalEleven = 0;
int finalThirteen = 0;
int finalSeventeen = 0;
int finalNineteen = 0;

int two = 0;
int three = 0;
int five = 0;
int seven = 0;
int eleven = 0;
int thirteen = 0;
int seventeen = 0;
int nineteen = 0;

int temp = 0;

for(int num = 1; num<=20; num++)
{
temp = num;
for(int i=2; i<=temp; i++)
{
if(temp%i == 0)
{
temp = temp/i;

switch ( i ){
case 2:
two++;
break;
case 3:
three++;
break;
case 5:
five++;
break;
case 7:
seven++;
break;
case 11:
eleven++;
break;
case 13:
thirteen++;
break;
case 17:
seventeen++;
break;
case 19:
nineteen++;
break;
}

i--;
}

}
if(two>finalTwo)
finalTwo = two;
if(three>finalThree)
finalThree = three;
if(five>finalFive)
finalFive = five;
if(seven>finalSeven)
finalSeven = seven;
if(eleven>finalEleven)
finalEleven = eleven;
if(thirteen>finalThirteen)
finalThirteen = thirteen;
if(seventeen>finalSeventeen)
finalSeventeen = seventeen;
if(nineteen>finalNineteen)
finalNineteen = nineteen;

two = 0;
three = 0;
five = 0;
seven = 0;
eleven = 0;
thirteen = 0;
seventeen = 0;
nineteen = 0;

}

int result = 1;

if(finalTwo>0)
result = (int) ((Math.pow(2, finalTwo)) * result);
if(finalThree>0)
result = (int) ((Math.pow(3, finalThree)) * result);
if(finalFive>0)
result = (int) ((Math.pow(5, finalFive)) * result);
if(finalSeven>0)
result = (int) ((Math.pow(7, finalSeven)) * result);
if(finalEleven>0)
result = (int) ((Math.pow(11, finalEleven)) * result);
if(finalThirteen>0)
result = (int) ((Math.pow(13, finalThirteen)) * result);
if(finalSeventeen>0)
result = (int) ((Math.pow(17, finalSeventeen)) * result);
if(finalNineteen>0)
result = (int) ((Math.pow(19, finalNineteen)) * result);

System.out.print(result);

}

}

спросил(а) 2015-02-10T07:43:00+03:00 5 лет, 8 месяцев назад
1
Решение
72

Попробуйте http://www.mathblog.dk/project-euler-problem-5/ как ссылку на сокращение вашего кода и повышение его масштабируемости.

Вот фрагменты со страницы:

private int[] generatePrimes(int upperLimit)
{
List<Integer> primes = new ArrayList<Integer>();
boolean isPrime;
int j;

primes.add(2);

for (int i = 3; i <= upperLimit; i += 2)
{
j = 0;
isPrime = true;
while (primes.get(j) * primes.get(j) <= i)
{
if (i % primes.get(j) == 0)
{
isPrime = false;
break;
}
j++;
}
if (isPrime)
{
primes.add(i);
}
}

return primes;
}

И главное будет выглядеть примерно так:

int divisorMax = 20;
List<Integer> p = generatePrimes(divisorMax);
int result = 1;

for (int i = 0; i < p.size(); i++)
{
int a = (int) Math.floor(Math.log(divisorMax) / Math.log(p.get(i)));
result = result * ((int)Math.pow(p.get(i),a));
}

System.out.print(result);

Это должно позволить вам масштабировать 1 - 30, изменяя divisorMax до 30. Я не уверен, что 10 - 30.

ответил(а) 2015-04-06T19:01:00+03:00 5 лет, 6 месяцев назад
Ваш ответ
Введите минимум 50 символов
Чтобы , пожалуйста,
Выберите тему жалобы:

Другая проблема