【问题标题】:Fibonacci Sequence in C generating negatives?C中的斐波那契数列产生负数?
【发布时间】:2014-03-02 15:23:36
【问题描述】:

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

这是我的代码:

#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 个数字为止,这些数字都是正确的。然后它就变得疯狂了,出现了负数,一切都错了。谁能看到我的代码中的错误?非常感谢任何帮助。

【问题讨论】:

  • 你听说过整数溢出吗? :) 谷歌搜索会有所帮助。
  • 在答案中添加信息:intlong int 的大小因系统而异。 C 标准仅要求 int 至少为 16 位,long 至少为 32。通常 int 为 32 位,long 为 32 或 64。@987654329 @ 必须至少为 64 位,并且通常正好是 64 位。有符号整数溢出的行为是undefined。通常的 2 的补码环绕是典型的,但即使对于使用 2 的补码表示的系统也不能保证 - 优化编译器可以做令人惊讶的事情。

标签: c types int fibonacci


【解决方案1】:

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

注意第 47 个斐波那契数是什么? 2,971,215,073

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

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

【讨论】:

  • 对不起,我在哪里提到了 C 特定的东西?我没有在 C# 上引用我的 cmets 的来源,但这里是:msdn.microsoft.com/en-us/library/5kzh1b5w.aspx -EDIT- 哎呀,谢谢!仓促阅读会犯这样的错误;我会修正我的答案
  • @bbil 如果你想得到提问者的支持,你必须给他> 15个代表。毫无意义地要求代表 1 用户投票。
  • 谢谢,大卫!不知道,但这是有道理的。
【解决方案2】:

我正在编写一个程序来为最多 1000 位的值生成斐波那契数列。

还不是你不是。您将值存储在 int 类型的变量中。通常此类变量是 32 位值,最大可能值为 2^31 - 1。这等于2,147,483,647,距离您达到 1,000 位数的目标还有一段距离。

第 47 个 斐波那契数是第一个超过2,147,483,647 的数。根据Wolfram Alpha,值为2,971,215,073

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

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

【讨论】:

  • 我将'seq'数组声明为double类型。但是现在从第 37 个值开始,数字仍然是错误的。我得到 24175186,而它应该以 17 结尾,而不是 16。从那里开始,所有的数字似乎都没有错。当然它不再溢出了,双精度类型是一个巨大的价值。
  • @user3277335 double 包含 15-17 个有效十进制数字。这比1000少得多。你会失去精度,最终你会溢出。同样,您不能将值拟合为双精度值。想想看。双精度为 8 个字节宽。您怎么能期望将 1,000 个十进制数字放入这样的变量中。你需要一个大整数类型。你将不得不接受我最后一段的真实性。
  • 除了 char、int、double 和 float 之外,我们没有学习过任何类型。关于我可以使用什么的任何线索?
  • 是的。使用 bigint 类型。例如 libgmp
【解决方案3】:

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2017-05-15
    • 2011-12-18
    • 2015-04-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-06-05
    相关资源
    最近更新 更多