我编写了一个 java 程序,它使用 collatz 序列查找数字链的长度。 collatz 序列是:如果数字是偶数,则将其除以二,如果是奇数,则乘以 3 并加一。当数字达到 1 时,序列结束。Additional Info on Collatz Sequence . 我的程序从 1 到 100 万找到数字的链长,但它停止在 113382。没有显示错误消息,程序只是停止打印数字。
*edit:我测试过,结果发现当程序在113383时,链条收敛到负值。谁能解释一下?
我包含了完整的代码,因为它很短。
public static void main(String[] args) {
int max =0, maxChain=0;
for(int i = 2; i <1000000; i++ )
{
int c =i;
int counter = 0;
while(c != 1)
{
if(c%2 ==0) c/=2;
else c= 3*c+1;
counter++;
}
if(counter > maxChain)
{
maxChain =counter;
max = i;
}
System.out.println(i);
}
System.out.println(max +" has a chain length of " +maxChain);
}
最佳答案
对于数字 113383
,迭代 #120 产生 827370449
。下一次迭代在数值上产生 2482111348
,它太大而无法放入 int
变量中,因此它会导致 arithmetic overflow。环绕成一个负数。
从那里开始,所有迭代的结果都是负数,尽管结果在 -1
中重复循环,但结果为 1
的循环终止条件永远不会发生,因此会出现无限循环。
但是,如果将变量类型更改为 long
,则可以避免溢出(无论如何对于这个起始数字),并且序列在 247 次迭代后结束。
顺便说一句,我通过简单地打印每次迭代发现了这一点,并且立即清楚发生了什么。你本可以做同样的事情并自己解决这个问题。调试与编码一样是一项方便的技能,因为我们都会遇到让我们感到惊讶的编码情况,并且自己找到原因总是更令人满意和难忘(这样您就不会再次落入同样的陷阱)。
关于java - 为什么 java 程序会在 113882 上卡住?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21372724/