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

如何优化Collatz序列C方法中的uint64_t溢出检测?

解决Collatz序列64位溢出误报问题

你的代码误报多的核心原因是不分奇偶统一做溢出检测:只有当n为奇数时,执行3*n+1才有可能触发64位无符号整数溢出;而n为偶数时执行n >> 1,数值只会变小,不可能溢出,原代码的提前检测把这些安全场景也误判成溢出了。

正确的溢出检测逻辑

针对奇数的3*n+1操作,正确的溢出判断条件应该是:
当n > (UINT64_MAX - 1) / 3时,3*n+1会超过UINT64_MAX(无符号64位最大值)。因为(UINT64_MAX -1)是最大的能被3整除后加1不溢出的上限,除以3得到的就是最大的n值,满足3*n+1 ≤ UINT64_MAX。

修改后的代码

把溢出检测移到奇数分支内部,只在需要执行3*n+1前做判断,同时优化了n=1后的循环逻辑:

#include <stdint.h>

uint64_t collatz_K(uint64_t n, uint64_t k) {
    while (k > 0) {
        // 进入1的循环链时,直接根据周期计算结果,避免无效循环
        if (n == 1) {
            switch (k % 3) {
                case 0: n = 1; break;
                case 1: n = 4; break;
                case 2: n = 2; break;
            }
            break;
        }

        if (n % 2 == 0) {
            n = n >> 1;
            k--;
        } else {
            // 仅在奇数分支做溢出检测
            if (n > (UINT64_MAX - 1) / 3) {
                return 0;
            }
            n = 3 * n + 1;
            k--;
        }
    }
    return n;
}

额外说明

原代码中n==1 && k%2==0的终止逻辑不够全面:当n=1后,序列会进入1→4→2→1的循环周期(周期长度3),直接根据剩余步数k对3取模,能一步得到最终结果,避免多余的循环迭代。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.23 12:57:14