java - 为什么 java 程序会在 113882 上卡住?

标签 java freeze collatz

我编写了一个 java 程序,它使用 collat​​z 序列查找数字链的长度。 collat​​z 序列是:如果数字是偶数,则将其除以二,如果是奇数,则乘以 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/

相关文章:

android - Nexus 10 camera.release 挂起 30 秒

delphi - TListView.Clear 卡住了我的应用程序,我该如何修复它?

C 递归 Collat​​z 猜想,直到值小于原始整数

Java 在我的 Java 代码中出现 .setText 错误

java - 带预览的多文件 uploader

debugging - WinDbg:APPLICATION_HANG_WRONG_SYMBOLS

c - 陷入 C 语言的 Loop Collat​​z 猜想尝试

c - 递归函数有一些限制吗?例如 : how many layers does the function require?

Java在堆栈之间移动数字

java - 在 Windows linux 和 MAC 上安装和运行应用程序作为服务