斐波那契数列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
相关产品推荐
相关产品推荐

