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

斐波那契数列while循环无法终止排查:求400万以内偶数和

问题分析与修正

核心错误点

  • 循环条件完全错误:题目要求计算小于4,000,000的偶数斐波那契数之和,你却用sum <= 4000000000作为循环终止条件——不仅数值写错(40亿 vs 400万),逻辑也完全偏离:应该判断新生成的斐波那契数是否小于4000000,而非累加和的大小。

  • int溢出导致死循环:int类型最大值约为21亿,斐波那契数增长极快,很快就会超出这个范围,溢出后变成负数。负数永远小于4000000,循环永远无法终止,同时累加和也会因为混入负数彻底混乱。必须用long long存储斐波那契数和累加和。

  • n的递增逻辑错误:循环内执行了两次n++,导致索引跳步,甚至触发数组越界访问。每次生成一个斐波那契数,n只需要递增一次。

  • 数组访问时机错误:未确认数组长度就直接访问fib[n+2],n递增后会出现越界访问,触发未定义行为。

修正后的代码

#include <iostream>
#include <vector>

using namespace std;

int main () {
    vector<long long> fib {0, 1};
    long long fn;
    int n = 0;
    long long sum = 0;
    const int LIMIT = 4000000;

    while (true) {
        fn = fib[n + 1] + fib[n];
        // 先判断新生成的数是否超过上限,超过则终止循环
        if (fn >= LIMIT) {
            break;
        }
        fib.push_back(fn);
        // 判断当前数是否为偶数,是则累加
        if (fn % 2 == 0) {
            sum += fn;
        }
        n++;
        cout << fn << " ";
    }
    cout << endl << "偶数斐波那契数之和:" << sum << endl;
    return 0;
}

额外优化提示

其实不需要用vector存储所有斐波那契数,只需要保存前两个值即可,大幅节省内存:

#include <iostream>

using namespace std;

int main () {
    long long a = 0, b = 1;
    long long sum = 0;
    const int LIMIT = 4000000;

    while (true) {
        long long next = a + b;
        if (next >= LIMIT) break;
        if (next % 2 == 0) {
            sum += next;
        }
        a = b;
        b = next;
        cout << next << " ";
    }
    cout << endl << "偶数斐波那契数之和:" << sum << endl;
    return 0;
}

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.06 21:15:20