就像我很伤心一样,我正在研究Euler问题12 https://projecteuler.net/problem=12,我相信这个程序会给出正确的答案,但是太慢了,我试图等待它,但是即使9分钟后它仍然无法完成它。我如何修改它以使其运行更快?
package highlydivisibletriangularnumber_ep12;
public class HighlyDivisibleTriangularNumber_EP12 {
public static void findTriangular(int triangularNum){
triangularValue = triangularNum * (triangularNum + 1)/2;
}
static long triangularValue = 0l;
public static void main(String[] args) {
long n = 1l;
int counter = 0;
int i = 1;
while(true){
findTriangular(i);
while(n<=triangularValue){
if(triangularValue%n==0){
counter++;
}
n++;
}
if(counter>500){
break;
}else{
counter = 0;
}
n=1;
i++;
}
System.out.println(triangularValue);
}
}
最佳答案
只是两个简单的技巧:
当x%n == 0
时,也将x%m == 0
与m = x/n
一起使用。这样,您只需要考虑n <= Math.ceil(sqrt(x))
即可,这极大地提高了速度。如果每个除数都小于平方根,则可以免费获得另一个除数。当心平等的情况。速度增益巨大。
由于您的x
是两个数字i
和i+1
的乘积,因此可以将其所有除数生成为i
和i+1
的除数的乘积。更复杂的是,通常可以使用不同的因素来创建同一产品。能在这里发生吗?您需要生成产品还是可以只计算它们?再次,速度增益是巨大的。
您可以使用素数分解,但是我敢肯定,仅这些技巧就足够了。
关于java - 我正在使用Euler 12,我的代码似乎正常工作,但速度太慢,非常慢。如何修改使其运行更快?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/48160040/