我正在编写一个程序,打印前50个斐波纳契数,从1和2开始. 数字必须用逗号分隔,后面跟一个空格,最后一个数字除外,它应该以换行符结束.

我try 的代码如下:

int main(void)
{
    int fib[50];
    fib[0] = 1;
    fib[1] = 2;
    int i;

    for (i = 0; i < 50; i++)
    {
        if (i == 0)
        {
            printf("%d ,", fib[0]);
        }
        else if (i == 1)
        {
            printf("%d ,", fib[1]);
        }
        else if (i == 49)
        {
            fib[i] = fib[i-1] + fib[i-2];
            printf("%d", fib[i]);
        }
        else 
        {
            fib[i] = fib[i-1] + fib[i-2];
            printf("%d ,", fib[i]);
        }
    }
    printf("\n");
    return (0);
}

我得到的结果是:

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 ,102334155 ,165580141 ,267914296 ,433494437 ,701408733 ,1134903170 ,1836311903 ,2971215073 ,512559680 ,3483774753 ,3996334433 ,3185141890 ,

推荐答案

您的代码中存在多个问题:

  • 您必须包括<stdio.h>才能正确使用printf.您可能忘记了问题代码中的第#include行,但正如所发布的,代码具有未定义的行为.

  • 在目前的绝大多数系统上,int型不够大,不足以容纳最高可达49的斐波纳契数.您应该使用类型long long intunsigned long long int,它们保证可以处理最大到263-1的数字(分别为264-1).

  • 格式字符串"%d ,"不正确:空格应该出现在逗号后面,而不是前面.

  • 发布的输出与代码不一致:某些数字大于231-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 ,102334155 ,165580141 ,267914296 ,433494437 ,701408733 ,1134903170 ,1836311903 ,-1323752223 ,512559680 ,-811192543 ,-298632863 ,-1109825406
    

    然而,请注意,带符号整数溢出的行为是未定义的,因此其他行为也是可能的,尽管不太可能.

  • 不需要数组,您只需使用3个变量并循环它们即可.

  • 将前2个数字设置为特殊情况,并在后面的每个数字前输出,和一个空格,这样更容易.

  • 你是想打印以1, 20, 1甚至1, 1开头的Fibonacci sequence,这是一个惯例问题.这位意大利数学家Fibonacci自己在他的时代(公元1202年)使用了1, 2,因为他在Liber Abaci岁时讨论了兔子数量的增长.事实上,费波纳奇被誉为在欧洲引入了以10为基数的记数法,并从他长大的阿拉伯世界引进了zero的概念.手稿图片中的数字显示了使用Indo-Arabic numerals的变体的序列号.在现代,更传统的做法是从0, 1开始,并将它们命名为F0F1.

以下是修改后的版本:

#include <stdio.h>

int main(void) {
    unsigned long long a = 1, b = 2;

    printf("%llu, %llu", a, b);

    for (int i = 2; i < 50; ++i) {
        unsigned long long c = a + b;
        printf(", %llu", c);
        a = b;
        b = c;
    }
    printf("\n");
    return 0;
}

C++相关问答推荐

我可以动态分配具有空类型函数的矩阵吗?

从STdin读写超过4096个字节

在C中使用动态内存分配找到最小的负数

如何创建由符号组成的垂直结果图形?

如何将字符串传递给函数并返回在C中更改的相同字符串?

初始变量重置后,char[]的赋值将消失

使用错误的命令执行程序

GDB输出ARM助记符

在Linux上使用vscode和lldb调试用Makefile编译的c代码

用C++从外部ELF符号读取值

tick.q中的Kdb+键控表语法

如何在VS 2022中正确安装额外的C头文件

Fprintf正在写入多个 struct 成员,并且数据过剩

为什么会导致分段故障?(C语言中的一个程序,统计文件中某个单词的出现次数)

Dlsym()的手册页解决方法仍然容易出错?

如何打印循环调度问题的时间表

在我的函数中实现va_arg的问题

如何在Rust中处理C的longjmp情况?

memcmp 是否保证按顺序比较字节?

文件指针引起的C程序分段错误