输出斐波纳契数列的前n项,每次输出后用'\n'换行.非常奇怪的是,当条目数量超过29个时,输出就会出现问题.

这是我的源代码.最初的 idea 是输出40个项目.

#include <stdio.h>

#define N 40

int main(void)
{
    int fib_number[N] = { 0, 1 };
    
    printf("%d\n%d\n", 0, 1);
    for (int i = 2; i < N; i++)
    {
        fib_number[i] = fib_number[i - 2] + fib_number[i - 1];
        printf("%d\n", fib_number[i]);
    }
    
    return 0;
}

N29时,输出没有问题:

0
1
1
2
3
5
8
13
21
34
55
89
144
233
377
610
987
1597
2584
4181
6765
10946
17711
28657
46368
75025
121393
196418
317811

接下来是当N30或大于30时的情况,并且输出有一个小问题.

(N=30)


1                                                                                                                       1
1
2
3
5
8
13
21
34
55
89
144
233
377
610
987
1597
2584
4181
6765
10946
17711
28657
46368
75025
121393
196418
317811
514229

除了第一行没有任何数字和最后一行似乎缺失的换行符之外,还有一个微妙的问题:第二行1之后有大量空格.

N等于40时,问题就更严重了:










89
144
233
377
610
987
1597
2584
4181                                                                                                                    89
144
233
377
610
987
1597
2584
4181
6765
10946
17711
28657
46368
75025
121393
196418
317811
514229
832040
1346269

如果我用' '替换'\n',输出就不会有问题:

0 1 1 2 3 5 8 13 21 34 55 89 144 233 377 610 987 1597 2584 4181 6765 10946 17711 28657 46368 75025 121393 196418 317811 514229 832040 1346269 2178309 3524578 5702887 9227465 14930352 24157817 39088169 63245986 

这让我感觉非常糟糕,因为我只能try 为一个我不知道原因的问题更改实现. 有没有人能告诉我出了什么问题,否则我以后可能不能毫无顾虑地使用'\n'.

推荐答案

你的程序没有任何问题,它应该可以很好地处理N47的值,超过这个值,当计算fib(47)时,你将有未定义的行为,因为加法将导致有符号整数溢出.

您可以使用类型unsigned long long产生两倍的输出(使用printf("%llu\n", fib_number[i])).

您记录的这个问题不在程序中,但可能来自您的系统:操作系统或其仿真,或者IDE中内置的终端应用程序或仿真器.try 另一种设置,在shell 提示符下直接运行该程序或将其输出重定向到一个文件.

C++相关问答推荐

是否定义了数组指针类型转换为指针类型?""""

在#include中使用C宏变量

如何设置指针指向在函数中初始化的复合文字中的整数?

为什么GCC可以调用未定义的函数?

C语言编译阶段与翻译阶段的关系

进程在写入管道时挂起

为什么Fread()函数会读取内容,然后光标会跳到随机位置?

-Wnonnull-Compare警告不是具有误导性吗?

这段代码用于在C中以相反的顺序打印数组,但它不起作用

递归打印二维数组(C编程)

生产者消费者计数器意外输出的C代码

在吉陀罗中,_2_1_和CONCAT11是什么意思?

如何在不更改格式说明符的情况下同时支持双精度和长双精度?

用C++初始化局部数组变量

区分MySQL C界面中的文本和BLOB字段

未为同一文件中的函数执行DirectFunctionCall

子进程不会修改父进程中的统计信息

OpenGL 中的非渐变 colored颜色 变化

如何在Linux上从控制台左上角开始打印文本?

即使我们确定要提供的数据类型,为什么还要在参数中使用 (void *ptr) ?