输出斐波纳契数列的前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++相关问答推荐

使用SWI—Prolog的qsave_program生成二进制文件有什么好处?'

在struct中调用函数,但struct在void中 *

无效指针值在函数调用之间莫名其妙地改变

为什么net/if.h在ifaddrs.h之前?

LONG_DOUBLE_T是否存在(标准C:C23)

如何创建一个C程序来存储5种动物的名字,并在用户 Select 其中任何一种动物时打印内存地址?

在 struct 中强制转换空指针

C语言中的外部关键字

覆盖读取函数,但当文件描述符为3或4时,我有问题

循环中的静态变量与块中的变量和循环

c程序,让用户输入两类数字,并给出输出用户输入多少个数字

C中的char**v*char[]

共享目标代码似乎不能在Linux上的进程之间共享

DennisM.Ritchie的C编程语言一书中关于二进制搜索的代码出现错误?

在同一范围内对具有相同类型的变量执行的相同操作在同一C代码中花费的时间不同

'printf("%s", user_input)' 危险吗?

是什么阻止编译器优化手写的 memcmp()?

如何正确探测平台设备?

C23 中是否有 __attribute__((nonnull)) 的等效项?

我们可以在不违反标准的情况下向标准函数声明添加属性吗?