[英]Can someone tell me why I get this output?
好的,所以我有一个由以下代码定义的Collatz序列长度:
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(collatz(3000))=> 48),以验证算法是否正确运行。 我使用各种站点来执行此操作,但是有一个站点拒绝工作。 这个数字恰好是ProjectEuler上第14个问题的解决方案。 这怎么可能呢,我每隔一个数字就得到正确的结果(正确的链长),而837799产生不同的结果:58,而不是524。
正如评论中其他指出的那样,这是一个溢出问题。 您可以通过打印函数调用的参数来发现这一点。
将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)));
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.