项目Euler#12需要帮助

时间:2015-08-12 13:08:55

标签: java

以下代码用于项目euler问题12.它的目的是找到第一个三角形数字,它有超过500个除数但只是无休止地运行。任何帮助将不胜感激

public class Problem12 {

    public static void main(String[] args) {
        int[] array = new int[20000];
        long trinumber = 1;
        int j;

        for (int i = 1;; i++) {
            j = 0;
            for (int k = 1; k <= trinumber; k++) {

                if (trinumber % k == 0) {
                    array[j] = k;
                    j++;
                }
            }
            if (array[500] != 0) {
                System.out.println(trinumber);
                return;
            }
            trinumber += i;
            array = new int[array.length];
        }
    }
}

2 个答案:

答案 0 :(得分:1)

您正在计算错误的三角数序列 问题在于:trinumber += i;
请注意,您案例的第二个三角形数字不是3,而是2 您应该在最外面的for循环之后直接移动该行代码 另外,将变量trinumber初始化为0而不是1:将此long trinumber = 1;更改为:long trinumber = 0;
您不需要变量array,而是使用计数器并在找到新除数时递增它,而不是在此之后检查该计数器是否等于500。

编辑:
以下是建议编辑的最终结果:

public static void main(String[] args) {
        System.out.println(System.currentTimeMillis());
        long trinumber = 0;

        for (int i = 1;; i++) {
            int numDivisors = 0;
            trinumber += i;

            for (int k = 1; k <= trinumber; k++) {

                if (trinumber % k == 0) {
                    numDivisors++;


                }
            }
            if (numDivisors > 500) {
                System.out.println(trinumber);
                System.out.println(System.currentTimeMillis());
                return;
            }


        }
    } 

有问题的数字是:76576500,我的机器上花了17个多小时才完成。因此,需要一些数学提示来改善该算法的运行时间。

答案 1 :(得分:0)

我对这个程序做了一些改动。希望这会有所帮助。 我的机器运行netbeans花了182分钟

 public static void main(String[] args) {
    long triNumber=0;
    int j=0;
    for (int n=0;;n++){
        triNumber=n*(n+1)/2;    //Triangular number calculation
        for (int i=1;i<=triNumber;i++){
            if(triNumber%i==0){
                j++;
            }
        }
        if (j>=500){
            System.out.println(triNumber);
            break;
        }
        j=0;
    }
}

第一个三角形数字是76576500,有超过500个除数 建立成功(总时间:182分44秒)