You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

基于Collatz猜想计算1-100起始值序列长度的代码问题求助

解决Collatz猜想序列长度统计问题

原代码的核心问题

  • count 变量定义在外部循环外,处理每个新数字时未重置,导致计数连续累加出错
  • 仅执行一次Collatz变换就输出结果,没有循环到序列终点(数字变为1)
  • 逻辑遗漏:起始数字本身是序列的第一个元素,但代码只做了一次变换就停止计数

正确实现代码

class Main {
    public static void main(String[] args) {
        // 遍历1到100的所有起始数字
        for (int startNum = 1; startNum <= 100; startNum++) {
            long currentNum = startNum; // 用long避免变换过程中数值溢出
            int sequenceLength = 1; // 起始数字本身算序列的第一个元素

            // 循环执行Collatz变换,直到数字变为1
            while (currentNum != 1) {
                if (currentNum % 2 == 0) {
                    currentNum = currentNum / 2;
                } else {
                    currentNum = 3 * currentNum + 1;
                }
                sequenceLength++; // 每完成一次变换,序列长度加1
            }

            // 输出起始数字与对应序列长度
            System.out.println(startNum + "-" + sequenceLength);
        }
    }
}

关键说明

  • 独立计数:把sequenceLength放到外部循环内部,每次处理新起始数字时重置为1,保证每个序列的计数互不干扰
  • 完整序列循环:用while (currentNum != 1)持续执行变换,直到序列走到终点1,确保统计的是完整序列的长度
  • 溢出防护:使用long类型存储当前数字,因为对较大的起始值执行3*x+1时,结果会超出int的取值范围,导致计算错误
  • 长度定义逻辑:起始数字本身是序列的第一个元素,所以初始长度设为1,每完成一次变换后长度加1

示例输出片段

1-1
2-2
3-8
4-3
5-6
...
97-119
98-26
99-30
100-26

内容的提问来源于stack exchange,提问作者Game Destroyer

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.13 23:17:24