Online Compiler C

#include <stdio.h> int main() { int n; // 读取输入的项数 n if (scanf("%d", &n) != 1 || n <= 0) { return 0; } int a = 1; // 记录前两项中的第一项 int b = 1; // 记录前两项中的第二项 for (int i = 1; i <= n; i++) { if (i == 1) { printf("%d", a); } else if (i == 2) { printf("%d", b); } else { int next = a + b; // 当前项等于前两项之和 printf("%d", next); a = b; // 让 a 变成原来的 b,为下一次计算做准备 b = next; // 让 b 变成当前的 next,为下一次计算做准备 } // 格式控制:如果不是最后一项,就在后面打印一个空格 if (i < n) { printf(" "); } } printf("\n"); // 打印完毕后换行 return 0; }
这段代码的功能是输出斐波那契数列的前 n 项。斐波那契数列的定义是:第一项和第二项都是 1,从第三项开始,每一项等于前两项之和。

代码通过循环依次计算并打印每一项,同时用变量 a 和 b 来保存最近的两项,以便计算下一项。输出时,每项之间用空格分隔,最后换行。

- 注意:当 n 为 1 时,循环只执行一次,输出第一项 1,然后结束。但代码中在 i == 1 时只打印了 a,没有更新 a 和 b 的值,这没有问题。不过,如果 n 为 2,循环会输出 1 和 1,但第二次循环时 i == 2,同样没有更新 a 和 b。这符合斐波那契数列的定义,但思考一下:如果 n 大于 2,第一次和第二次循环都没有更新 a 和 b,那么第三次循环时 a 和 b 仍然是初始值 1 和 1,计算 next 得到 2,然后更新 a 和 b。这样逻辑是正确的。

- 一个可以思考的点:代码中在 i == 1 和 i == 2 时没有更新 a 和 b,但后续循环依赖 a 和 b 的值。如果 n 很大,这种写法没有问题。但你可以考虑是否有一种更统一的方式,让所有项的计算都遵循相同的规则,而不需要单独处理前两项。例如,是否可以在循环开始前就设置好 a 和 b 的初始值,然后每次循环都计算下一项并更新?这样代码会更简洁。