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

C++实现Project Euler第2题输出-1833689714,求问题排查

排查Project Euler第2题C++程序的负输出问题

嘿,你遇到的这个负数结果,百分百是整数溢出搞的鬼!这在处理斐波那契这类增长快的数列时特别常见,让我帮你拆解清楚:

问题根源:32位int的范围顶不住

咱们C++里的int默认是32位有符号整数,最大只能到2147483647(也就是约21亿)。虽然题目要求的是不超过400万的斐波那契数,但如果你的代码里用int存斐波那契数或者累加和,很可能在循环过程中数值超过了这个上限——有符号整数溢出后会触发“绕回”,变成负数,这就是你得到-1833689714的原因。

另外还有一种可能:你没写对循环终止条件,导致斐波那契数一直生成,直到溢出变负还在继续累加,最后总和自然成了负数。

怎么解决?两步走

  • 换用更大的整数类型:把存储斐波那契数和累加和的变量都换成long long,它是64位的,最大能到9e18,别说400万,就算更大的数也能轻松hold住。
  • 盯紧循环终止条件:确保你的循环在斐波那契数超过400万时立刻停下,别让它瞎跑。

给你写个正确的示例代码

#include <iostream>
using namespace std;

int main() {
    long long total = 0;
    long long prev = 1, curr = 2;
    
    while (curr <= 4000000) {
        // 只加偶数项
        if (curr % 2 == 0) {
            total += curr;
        }
        // 生成下一个斐波那契数
        long long next = prev + curr;
        prev = curr;
        curr = next;
    }
    
    cout << total << endl; // 正确结果应该是4613732
    return 0;
}

额外小技巧:利用斐波那契偶数项的规律

其实斐波那契数列里每3项才出一个偶数,而且偶数项满足E(n) = 4*E(n-1) + E(n-2),用这个规律可以不用每次判断奇偶,直接计算偶数项,效率更高。不过这属于进阶优化,先把溢出和循环的问题解决了再说~

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.25 07:05:01