基于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
相关产品推荐
相关产品推荐

