C中的Fibonacci序列产生负数?

时间:2014-02-05 22:36:35

标签: c types int fibonacci

我是编程新手,需要C语言帮助。我正在编写一个程序,为最多1000位数的值生成Fibonacci序列。

这是我的代码:

#include <stdio.h>

int main(void)
{
    int seq[1000];
    int i,n;

    printf("How many Fibonacci numbers do you want?: ");
    scanf("%d",&n);

    seq[0] = 0;
    seq[1] = 1;

    for(i = 2; i < n; i++)
        seq[i] = seq[i-1] + seq[i-2];

    for (i = 1; i < n; i++)
        printf("%d: %d\n", i, seq[i]);

    return 0;
}

现在的问题是,这些数字都是正确的,直到第47个数字。然后它变得疯狂,并且有负数而且全部错了。任何人都可以在我的代码中看到错误吗?非常感谢任何帮助。

3 个答案:

答案 0 :(得分:4)

  

我正在编写一个程序来为最多1000位的值生成Fibonacci序列。

不是你不是。您将值存储在int类型的变量中。通常,这些变量是32位值,并且最大可能值为2^31 - 1。这相当于2,147,483,647,这远远超过了达到1,000位数的目标。

47 th Fibonacci数是第一个超过2,147,483,647的数字。根据{{​​3}},值为2,971,215,073

当你的程序试图计算这样的数字时,它会遇到整数溢出,因为真值不能存储在int中。您可以尝试准确分析溢出时会发生什么,为什么看到负值,但它确实不会让您走得太远。简而言之,int显然无法完成您的尝试。

要达到1,000位数,您需要使用大整数类型。没有任何内置类型可以处理您打算处理的数字。

答案 1 :(得分:2)

我上面发表的评论有简单的答案,但这里有一个更完整的版本:C通常表示32位序列的整数,它们可以采用的值范围是-2,147,483,648到2,147,483,647。

请注意第47个斐波纳契数是多少? 2971215073

它们溢出后,它们会绕到可能的最小整数;有关更多信息,请参阅2的补码表示法!

对于解决方案,我可能会建议a BigInteger structure。但斐波那契数字get huge really fast,所以我不确定你真的想要计算那么多。

答案 2 :(得分:2)

您没有使用正确的数据类型;斐波那契数字往往快速增长。所以你可能超出了int的限制:2 ^ 31。 由于int和long都是32位整数(在大多数情况下 - > gcc和VS)尝试使用long long。