就像我很伤心一样,我正在研究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 == 0m = x/n一起使用。这样,您只需要考虑n <= Math.ceil(sqrt(x))即可,这极大地提高了速度。如果每个除数都小于平方根,则可以免费获得另一个除数。当心平等的情况。速度增益巨大。

由于您的x是两个数字ii+1的乘积,因此可以将其所有除数生成为ii+1的除数的乘积。更复杂的是,通常可以使用不同的因素来创建同一产品。能在这里发生吗?您需要生成产品还是可以只计算它们?再次,速度增益是巨大的。

您可以使用素数分解,但是我敢肯定,仅这些技巧就足够了。

关于java - 我正在使用Euler 12,我的代码似乎正常工作,但速度太慢,非常慢。如何修改使其运行更快?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/48160040/

10-12 13:38