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

反向打印斐波那契数列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;
}

逻辑说明

  1. 先将数组末尾两个位置设为斐波那契起始项0和1
  2. 从倒数第三个位置开始,向前依次计算前两项的和并赋值,数组从前往后即为从大到小的斐波那契序列
  3. 输入20时,会正确生成以4181开头的反向序列

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.01 21:40:57