Java I';我正在处理Euler12,我的代码似乎工作正常,但太慢了,非常慢。如何修改它以使其运行更快?

Java I';我正在处理Euler12,我的代码似乎工作正常,但太慢了,非常慢。如何修改它以使其运行更快?,java,performance,Java,Performance,就像我难过的一样,我正在研究Euler问题12,我相信这个程序会给出正确的答案,但是太慢了,我试着等它出来,但即使9分钟后它仍然不能完成。如何修改它以使其运行更快 package highlydivisibletriangularnumber_ep12; public class HighlyDivisibleTriangularNumber_EP12 { public static void findTriangular(int triangularNum){ triangularV

就像我难过的一样,我正在研究Euler问题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);
}
}
package highlydivisibletriangularnumber\u ep12;
公共类高可除数三角数\u EP12{
公共静态空心三角形(int三角形){
triangularValue=triangularNum*(triangularNum+1)/2;
}
静态长三角形值=0l;
公共静态void main(字符串[]args){
长n=1l;
int计数器=0;
int i=1;
while(true){
findTriangular(i);
而(n500){
打破
}否则{
计数器=0;
}
n=1;
i++;
}
System.out.println(三角值);
}
}

在我看来,您的算法有点过于暴力,因此,无论您如何重新排列它,都将消耗大量的cpu时间

我们需要的是一个算法,它实现一个公式,至少计算部分解,而不是粗暴地强迫整个过程


如果你陷入困境,你可以使用你最喜欢的搜索引擎找到许多不同效率的解决方案。

只有两个简单的技巧:


x%n==0
时,也可以
x%m==0
使用
m=x/n
。这样,你只需要考虑<代码> n“这个程序会给出正确的答案,但是太慢”——然后这个问题属于,而不是堆叠溢出。“我需要一个更快的算法”不一定是SO的主题,也不一定是代码评审的主题。一个不同的算法在某种意义上是不充分的,这并不意味着它是这样的。然而,我想说的是,这个问题太宽泛了。算法改进:通过计算候选数的素因子(包括多重性)的不同组合的数量来计算因子。使用预先计算的素数列表,计算因子的速度应该比现在的扫描速度快得多。@JohnBollinger是的,但这可能是一种过激行为。看看我的答案。