题目

从标准输入读入一个正整数 n,输出斐波那契数列的前 n 项(数列从 1, 1, 2, 3, 5, 8... 开始)。

输入格式:一行输入一个正整数 n。

输出格式:在一行中输出斐波那契数列前 n 项,数字之间以空格分隔,末尾换行。

数据范围与约定:1 ≤ n ≤ 50。

思路与算法

1. 滚动变量优化空间
前两项固定为 1。生成后续项时,只需维护前两项 a 和 b,通过 c = a + b; a = b; b = c; 滚动向前更新,空间复杂度仅为 O(1)。

2. 格式控制与大数
斐波那契数列增长迅速,项值需用 long long 存储;输出格式需注意行末无多余空格。

完整程序

#include <stdio.h>

int main(void)
{
    int n;
    if (scanf("%d", &n) != 1 || n < 1) {
        return 1;
    }

    // 滚动变量法:斐波那契数列第 n 项等于前两项之和(F(n) = F(n-1) + F(n-2))
    long long a = 1, b = 1;
    for (int i = 1; i <= n; i++) {
        if (i <= 2) {
            printf("%lld", a);
        } else {
            long long c = a + b;
            printf("%lld", c);
            // 向前滚动更新
            a = b;
            b = c;
        }
        if (i < n) {
            putchar(' ');
        }
    }
    putchar('\n');
    return 0;
}

运行示例

输入:

7

输出:

1 1 2 3 5 8 13

其它写法

下面每种写法都是完整程序,输入输出格式与正文一致,便于对照。

数组存每一项再输出

程序:

#include <stdio.h>

int main(void)
{
    int n;
    if (scanf("%d", &n) != 1 || n < 1 || n > 50) {
        return 1;
    }
    long long f[51];
    f[1] = f[2] = 1;
    for (int i = 3; i <= n; i++) {
        f[i] = f[i - 1] + f[i - 2];
    }
    for (int i = 1; i <= n; i++) {
        printf("%lld%c", f[i], i < n ? ' ' : '\n');
    }
    return 0;
}

输入:

7

输出:

1 1 2 3 5 8 13