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

求解最长考拉兹序列代码n>4254时入参错误段错误问题排查

代码问题分析

你的代码存在以下几个核心问题:

  • 记忆化数组未初始化
    你用malloc申请的v数组仅分配了内存空间,未做初始化操作,数组内全部是随机的脏数据。你的逻辑依赖v[x]==0判断该值是否被缓存过,脏数据会导致逻辑完全错乱。n≤4254时运行正常完全是巧合,刚好这些下标对应的内存脏值碰巧为0。
  • 数组访问无边界检查,触发越界写
    考拉兹序列计算过程中,奇数会执行3*x+1操作,中间生成的x值会远大于输入的n,很容易超过你定义的RANGE=5000000阈值。你没有做任何边界判断就直接读写v[x],当x超出数组范围时会发生堆内存越界,越界写入会破坏其他内存区域的数据,比如函数栈帧的入参、返回地址等,这就是你观察到cycles函数入参变成异常值、最终触发段错误的直接原因。
  • 记忆化逻辑设计错误
    当前代码仅在跳出while循环时给最终的x值缓存步数,计算过程中经过的所有中间x值的步数都没有被存储,记忆化的优化效果完全没有发挥,大部分场景还是暴力计算。
  • 整数溢出风险
    你用int类型存储x,3*x+1的计算结果很容易超过32位int的最大值,溢出后x会变为负数,访问v[x]相当于负下标越界,也会直接触发段错误。
修复建议
  1. 数组申请后立刻初始化所有元素为0,可提前设置v[1] = 1,减少特殊判断逻辑。
  2. 访问v[x]前先判断x是否小于RANGE,超出范围时跳过缓存逻辑,继续正常计算即可。
  3. 优化记忆化逻辑,迭代时记录计算路径,把路径上所有x值对应的步数都存入缓存,或者改用递归+记忆化的实现方式。
  4. 将x的类型改为long long,避免计算过程中发生整数溢出。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.27 15:54:07