【发布时间】:2013-04-21 18:45:48
【问题描述】:
好的,所以我有一个由以下代码定义的 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),以验证算法是否正常工作。我使用various sites 来执行此操作,但一个号码拒绝工作。而这个数字正是 ProjectEuler 第 14 个问题的解。这怎么可能,每隔一个数字我都会得到正确的结果(正确的链长度),而 837799 会产生不同的结果:58,而不是 524。
【问题讨论】:
-
只是一个猜测:也许这个数字被选择得非常特别,因为它生成的序列包含大量溢出 Java
int? -
你试过用 long 吗?
-
Mat 说得对,用
long看看。 -
@Eng.Fouad - 整数运算在这里很好。除以 2 仅适用于偶数。
-
马特和子瑶是对的。我跟踪了整个程序,发现数字太大,
int无法处理。将所有内容更改为long,然后重试。
标签: java algorithm math collatz