反向打印斐波那契数列C++代码错误排查:输出异常求助
斐波那契数列反向存储打印问题修复
问题情况
尝试通过数组存储斐波那契数列并实现反向打印,输入20时输出异常:缺失首项4181,且出现多余的8。
原代码
#include <iostream> using namespace std; int main() { int num; int t1=0; int t2=1; int next; cin>>num; int arr[num]; for (int i = num-1; i >= 0; i--) { if (i == num-t1-1) { arr[i] = t1; continue; } if (i == num-t2-1) { arr[i] = t2; continue; } next = t1+t2; arr[i] = next; t1 = t2; t2 = next; } for(int j=0;j<num;j++) { cout<<arr[j]<<" "; } return 0; }
输出对比
- 实际输出(输入20时):
2584 1597 987 610 377 233 144 89 55 34 21 8 13 8 5 3 2 1 1 0
- 预期输出:
4181 2584 1597 987 610 377 233 144 89 55 34 21 13 8 5 3 2 1 1 0
问题分析
原代码核心逻辑错误在于用斐波那契数列的项值(t1、t2)去计算数组索引(i == num-t1-1),完全偏离正常序列生成逻辑:
t1和t2是数列的数值,不是计数变量,导致索引匹配混乱,跳过了本该生成的大项(如4181)- 错误的索引判断会触发重复赋值,导致出现多余的8
修正后的代码
#include <iostream> using namespace std; int main() { int num; int t1 = 0, t2 = 1, next; cin >> num; int arr[num]; // 填充数组最后两个初始项 arr[num - 1] = t1; arr[num - 2] = t2; // 从倒数第三项开始向前生成斐波那契数 for (int i = num - 3; i >= 0; i--) { next = t1 + t2; arr[i] = next; t1 = t2; t2 = next; } // 输出数组 for (int j = 0; j < num; j++) { cout << arr[j] << " "; } return 0; }
逻辑说明
- 先将数组末尾两个位置设为斐波那契起始项0和1
- 从倒数第三个位置开始,向前依次计算前两项的和并赋值,数组从前往后即为从大到小的斐波那契序列
- 输入20时,会正确生成以4181开头的反向序列
内容的提问来源于stack exchange,提问作者adarsh tiwari
相关产品推荐
相关产品推荐

