就像我一样悲伤,我正在研究欧拉问题 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/