在C中生成不正确的Fibonacci序列

时间:2014-11-10 10:56:44

标签: 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

它开始出错了。根据{{​​3}},48应该是4807526976。

我认为它可能会溢出?但是这本书没有对此发出警告。嗯...

1 个答案:

答案 0 :(得分:1)

原因:它溢出。

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

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

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