[英]Project Euler #5 Java -suggestions on making my code a little more clean
So I've gone through and redone my code. 因此,我仔细研究并重做了我的代码。 I previously tried the brute force method, which worked, but it took about 20 minutes for it to get to the correct answer. 我以前尝试过蛮力法,这种方法行得通,但是花了大约20分钟才能找到正确的答案。 The code I have now does this almost instantly by finding the prime decomposition of each number 1-20 and taking the greatest number of prime digits among all of the decompositions, for each prime number below 20. It does all of this fine, but I was interested in what if I wanted to find the the smallest multiple between a different range of numbers, say 1-30, or even more enthusiastic, 10-30? 我现在的代码几乎可以立即找到1-20的每个数字的质数分解,并在所有分解中取最大质数的数字(对于20以下的每个质数)立即执行此操作。这一切都很好,但是我如果我想在不同范围的数字(例如1-30,甚至更热烈的10-30)之间找到最小的倍数,我会感兴趣吗? With the code I have now that wouldn't be possible without changing a lot of my code. 现在有了代码,不更改很多代码就不可能了。
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);
}
}
Try http://www.mathblog.dk/project-euler-problem-5/ as a reference to shortening up your code and making it more scalable. 尝试http://www.mathblog.dk/project-euler-problem-5/作为缩短代码并使其更具可伸缩性的参考。
Here's the snippets from the page: 以下是页面中的片段:
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;
}
And main would look something like this: main看起来像这样:
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);
This should allow you to scale 1 - 30 by changing divisorMax to 30. I'm not sure about 10 - 30. 通过将divisorMax更改为30,应该可以缩放1-30。我不确定10-30。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.