有人能告诉我为什么我得到这个输出?

时间:2013-04-21 18:45:48

标签: java algorithm math collatz

好的,所以我的Collat​​z序列长度由以下代码定义:

    private static int count = 0;

    private static int collatz(int n){
        count++;
        if(n > 1){
            if(n % 2 == 0){
                return collatz(n/2);
            }
            return collatz(3*n+1);
        }
        return count-1;
    }

现在,我检查了不同数字的输出(例如print(collat​​z(3000))=> 48)以验证算法是否正常工作。我用various sites来做这件事,但有一个号码拒绝工作。这个数字正好是ProjectEuler上第14个问题的解决方案。这怎么可能,每隔一个数字,我得到正确的结果(正确的链长),而837799产生不同的结果:58,而不是524。

1 个答案:

答案 0 :(得分:1)

正如评论中指出的那样,这是一个溢出问题。你可以通过打印函数调用的参数来发现它。

int更改为long,甚至更好,以确保它不会溢出,请使用BigInteger

private static int collatz(BigInteger n) {
    count++;
    if (n.compareTo(BigInteger.ONE) > 0) {
        if (!n.testBit(0)) // even
            return collatz(n.divide(BigInteger.valueOf(2)));

        else
            return collatz(n.multiply(BigInteger.valueOf(3)).add(BigInteger.ONE));
    }
    return count - 1;
}

public static void main(String[] args) {
    System.out.println("res: " + collatz(BigInteger.valueOf(837799)));
}