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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.20 20:54:15