VBA最长考拉兹序列问题:如何统计各序列长度?
解决1-1000最长Collatz序列的VBA实现
你的原代码存在几个关键问题:
- 循环中直接修改迭代变量
i,导致For循环的遍历逻辑混乱,大量数字会被跳过 maxSteps用公式估算序列长度,并非实际统计的真实步数- 没有实现统计每个序列长度的逻辑,也未跟踪最长序列的相关信息
下面是修正后的代码,完整添加了序列长度统计和最长序列跟踪的逻辑:
Sub LongestCollatzSequence() Dim startNum As Long ' 遍历的起始数(1到1000) Dim currentNum As Long ' 序列中的当前计算数 Dim steps As Integer ' 当前序列的长度 Dim maxLength As Integer ' 记录最长序列的长度 Dim maxStartNum As Long ' 记录最长序列对应的起始数 ' 初始化最长序列的初始值 maxLength = 0 maxStartNum = 1 ' 逐个遍历1到1000的所有数字 For startNum = 1 To 1000 currentNum = startNum ' 用临时变量保存起始数,避免破坏循环迭代 steps = 1 ' 步数从1开始(包含起始数本身) ' 生成Collatz序列,直到当前数变为1 Do While currentNum <> 1 If currentNum Mod 2 = 0 Then currentNum = currentNum / 2 ' 偶数执行除以2操作 Else currentNum = 3 * currentNum + 1 ' 奇数执行3n+1操作 End If steps = steps + 1 ' 每完成一次变换,步数加1 Loop ' 对比当前序列长度,更新最长序列记录 If steps > maxLength Then maxLength = steps maxStartNum = startNum End If ' 可选:打印每个起始数的序列长度,方便调试查看 Debug.Print "起始数 " & startNum & " 的序列长度:" & steps Next startNum ' 输出最终结果 Debug.Print "------------------------" Debug.Print "1到1000中最长Collatz序列的起始数:" & maxStartNum Debug.Print "最长序列的长度:" & maxLength End Sub
关键逻辑说明
- 用
startNum作为循环迭代变量,currentNum作为临时变量处理序列计算,避免破坏循环的遍历顺序 steps变量从1开始计数(包含起始数本身),每执行一次Collatz变换就加1,直到currentNum变为1- 每次计算完一个数的序列长度后,和
maxLength对比,更新最长序列的记录 - 保留
Debug.Print输出,方便查看每个数的计算结果和最终结论
内容的提问来源于stack exchange,提问作者Agnes
相关产品推荐
相关产品推荐

