c - 在 C 中生成不正确的斐波那契数列

标签 c loops fibonacci

我正在尝试学习 C,但我正在努力找出这个简单程序中的错误所在:

// variable length arrays.

#include <stdio.h>

int main (void)
{
    int i, numFibs;

    printf ("How many Fibonacci numbers do you want (between 1 and 75)? ");
    scanf ("%i", &numFibs);

    if (numFibs < 1 || numFibs > 75) {
        printf ("Bad number, sorry!\n");
        return 1;
    }

    unsigned long long int Fibonacci[numFibs];

    Fibonacci[0] = 0;
    Fibonacci[1] = 1;

    for (i = 2; i < numFibs; ++i)
        Fibonacci[i] = Fibonacci[i-2] + Fibonacci[i-1];

    for (i = 0; i < numFibs; ++i)
        printf ("%i    %llu\n", i, Fibonacci[i]);

    printf ("\n");

    return 0;

}

该程序来自教科书《C 语言编程》。

为什么它会产生错误的序列:

How many Fibonacci numbers do you want (between 1 and 75)? 70

//删除了一些。

31    1346269
32    2178309
33    3524578
34    5702887
35    9227465
36    14930352
37    24157817
38    39088169
39    63245986
40    102334155
41    165580141
42    267914296
43    433494437
44    701408733
45    1134903170
46    1836311903
47    2971215073
48    512559680
49    3483774753
50    3996334433
51    3185141890
52    2886509027
53    1776683621

事情开始出错了。根据 http://www.maths.surrey.ac.uk/hosted-sites/R.Knott/Fibonacci/fibtable.html 48 应该是 4807526976 .

我认为它可能溢出了?但书中并没有对此发出警告。嗯...

最佳答案

原因:溢出。

请注意,4807526976 - 512559680 = 4294967296 = 2^32,在您的平台上,unsigned long long 类型被认为是 32 位而不是 64 位。

解决方案:尝试使用较大的整数类型,例如 int64_t(您可能需要包含 stdint.h)或维护自己的高精度数据类型。

有关整数溢出的详细信息,请参阅 http://en.wikipedia.org/wiki/Integer_overflow

关于c - 在 C 中生成不正确的斐波那契数列,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26842174/

相关文章:

c - 如何计算正在运行的线程(pthreads)的数量?

c - 看似正确引用后对 dll 库中函数的 undefined reference

c - typedef,在两个函数中找不到错误

python - 根据有放回的组合计算列的乘积

ruby - 优化递归搜索

javascript - JavaScript 中的斐波那契数列

c - C语言中如何使用管道连接两个子进程

php - 在单独的 DIV 中显示来自 MySQL 的每一行

Java 计数器无法正常工作

python : Fibonacci sequence using range(x, y,n)