C语言如何打印50项斐波那契数列?n=50时运行异常如何解决
故障原因
代码n取50时运行异常和数值溢出没关系,是两个低级逻辑错误导致的:
- 数组越界:你定义的
arr[50]合法下标只有0~49,但原来的循环逻辑在n=50时,循环变量j会一路加到51,直接读写数组范围外的内存,属于C语言里典型的未定义行为,轻则输出乱码,重则程序直接崩溃。 - 循环边界写错了:要输出n项斐波那契,只需要把数组前n个位置填上数就行,原来的循环不管n是多少都会多算好多项,哪怕n取1、2这种很小的值,也存在越界风险。
额外提一句:unsigned long long是64位无符号整数,最多能存到第93项斐波那契数,存前50项完全没压力,根本不需要换大数库之类的复杂方案。
修复后代码
#include <stdio.h> int main() { int n; scanf("%d", &n); // 加个输入校验,避免输入超出1~50范围导致异常 if (n < 1 || n > 50) { printf("请输入1到50之间的整数\n"); return 1; } unsigned long long arr[50] = {0, 1}; // 从第3项(下标2)开始填数,填到第n项就停,不会越界 for (int j = 2; j < n; j++) { arr[j] = arr[j-2] + arr[j-1]; } for (int i = 0; i < n; i++) { printf("%d => %llu\n", i, arr[i]); } return 0; }
效果验证
修复后输入50可以正常运行,最后一项(下标49)的输出值为7778742049,结果正确,全程没有越界访问,不会出现运行崩溃、输出乱码的问题。
内容的提问来源于stack exchange,提问作者romjan
相关产品推荐
相关产品推荐

