项目Euler 14 Java

时间:2015-03-05 14:14:22

标签: java recursion collatz

我在Problem 14 on Project Euler遇到了麻烦。我不明白为什么我的代码(Java)不起作用,任何帮助都会受到赞赏。

public class Calculate {

    public static void main(String[] args){
        System.out.println(calc());
    }

    public static int calc(){
        int max = 0;
        int maxI = 0;
        for (int i = 0; i < 1000000; i++){
            if (seqLen(i) >= max){
                max = seqLen(i);
                maxI = i;
            }
        }
        return maxI;
    }

    public static int seqLen(int seed){
        if (seed <= 0) return 0;
        if (seed == 1) return 1;
        int len = 1;
        if (seed % 2 == 0){
            len += seqLen(seed/2);
        }
        else{
            len += seqLen((3*seed)+1);
        }
        return len;
    }

}

谢谢!

3 个答案:

答案 0 :(得分:1)

使用int变量遇到溢出。

此计算中出现的最大数量(使用暴力方法时)为56991483520

Java的int最大值为2^31-1 == 2147483647,显然更小。

因此,请更改您的变量等以使用long。这里的最大值为2^63-1 == 9223372036854775807,适合所有值。

答案 1 :(得分:1)

您违反了int限制。

使用long

public static long calc() {
    long max = 0;
    long maxI = 0;
    for (long i = 0; i < 1000000; i++) {
        long len = seqLen(i);
        if (len >= max) {
            max = len;
            maxI = i;
        }
    }
    return maxI;
}

public static long seqLen(long seed) {
    if (seed <= 0) {
        return 0;
    }
    if (seed == 1) {
        return 1;
    }
    long len = 1;
    if (seed % 2 == 0) {
        len += seqLen(seed / 2);
    } else {
        len += seqLen((3 * seed) + 1);
    }
    return len;
}

public void test() {
    System.out.println(seqLen(13));
    System.out.println(calc());
}

为您提供837799

的正确结果

请注意,有比这更好/更有效的算法。

答案 2 :(得分:0)

实际上,您不必从1到499999进行检查。 您只需要检查500000到999999 因为在500000和999999之间的任何偶数的下一步 将是从1到499999的某个整数。 这意味着从1到499999的整数不能成为答案。

所以将for循环更改为以下

for (int i = 500000; i < 1000000; i++) {

}

并且“我”不一定很长 而“种子”必须很长。