java - 我正在研究 Euler 12,我的代码似乎可以正常工作,但是太慢了,非常非常慢。我该如何修改它才能运行得更快?

标签 java performance

就像我一样悲伤,我正在研究欧拉问题 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是两个数字 i 的乘积和i+1 ,您可以将其所有除数生成为 i 的除数的乘积。和i+1 。使事情变得更加复杂的是,一般来说,可以使用不同的因素来创建相同的产品。这里能发生吗?您需要生成产品还是可以只计算产品数量?同样,速度增益是巨大的。

您可以使用素因数分解,但我确信,仅这些技巧就足够了。

关于java - 我正在研究 Euler 12,我的代码似乎可以正常工作,但是太慢了,非常非常慢。我该如何修改它才能运行得更快?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48160040/

相关文章:

java - 更改 Firebase 数据结构后出现 UnrecognizedPropertyException

java - 如何制作面向android的应用程序修复?

c - 文件系统性能

performance - 斯卡拉 : better solution

java - 弦乐与表演

java - 创建一个 Maven 原型(prototype)以从一个类模板生成多个类

java - JMockit:如何根据构造函数中给出的参数来模拟方法?

java - 调用库比使用自己的代码慢吗?

Java 8 - 将 List<byte[]> 合并到 byte[] 的最有效方法

java - 将 ImageView 传递给下一个 Activity