【问题标题】:C:Why does a seemingly right algorithm goes wrong as input gets big? [duplicate]C:为什么一个看似正确的算法会随着输入变大而出错? [复制]
【发布时间】:2017-06-14 14:44:36
【问题描述】:

原来的问题是: 根据定义,定义一个产生第 n 个斐波那契数的函数: fib(0)=1;fib(1)=1;fib(n)=fib(n-1)+fib(n-2)

我试图用 C 编程中的 if & else 结构来解决这个问题。我成功地做到了,并用一些小的输入对其进行了测试。当输入数字为“45”时,一切似乎都很好。但是,当输入“46”时,结果变为负数,这表明一定出了问题。 真的希望有人能告诉我这是为什么,我做错了什么?

The result when input 45

the result when input 46

源代码:

包括

int fib(int i)
{
    if (i == 0)
     return 1;
    else if (i == 1)
      {
        int result_1 = fib(i - 1);
        return result_1;
    }
    else 
    {
        int result_2= fib(i-1) + fib(i-2);
        return result_2;
    }
}

int main(void)
{
    printf("The final result is %d\n", fib(i));
    return 0;
}

【问题讨论】:

  • 它超出了INT_MAX 可能是+2147483647
  • 非常感谢。那么有什么方法可以让我得到正确的答案(当输入数字超过 45 时)?
  • 您需要使用long long int 而不是int 来扩展变量,但这需要C99 std.
  • C 不会检查您是否超出特定数据类型的范围。在您的机器上,第一位表示它是否为负数。通常一半的数字是负数,另一半是正数。斐波那契数列呈指数收敛。您可以使用 long 作为示例,但您会很快遇到同样的问题。您可以通过分配一个具有最大正整数值的 int 来轻松测试这一点,然后将其加 1。您会发现自己突然处于负值范围内。

标签: c


【解决方案1】:

这可能是由于int 被签名并在2e16 - 1 之后变为负数。

尝试使用unsigned int。但即使这可行,您仍然受到限制,但 int 最大大小。

您可以尝试使用unsigned longunsigned long longdouble 来检查您的功能可以达到多远。

【讨论】:

  • 我将改写:但即使这样有效,你仍然受到限制,但 int 最大大小。 到:但即使这样有效,你仍然在范围内[UINT_MIN ... UINT_MAX]
猜你喜欢
  • 2018-05-19
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-01-07
  • 2011-12-16
  • 1970-01-01
相关资源
最近更新 更多