题目

输出斐波那契数列前 n 项

思路

本题输出斐波那契数列的前 n 项(通常从 1, 1, 2, 3… 开始)。

读入 n 后,先设前两项 a=1, b=1。在循环里打印当前项,再用 c=a+b; a=b; b=c 滚动到下一对;n==1 时只输出一项,需单独分支。

解题分析

输出前 n 项用滚动变量 a、b 更新,比递归重复计算快很多。f1、f2 为 1 的约定与第 52 题单求第 n 项一致。

完整程序

#include <stdio.h>

int main(void)
{
    int n;
    if (scanf("%d", &n) != 1 || n < 1) {
        return 1;
    }
    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