Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/63.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C:为什么一个看似正确的算法会在输入变大时出错?_C - Fatal编程技术网

C:为什么一个看似正确的算法会在输入变大时出错?

C:为什么一个看似正确的算法会在输入变大时出错?,c,C,原来的问题是: 根据定义定义一个生成第n个斐波那契数的函数: fib(0)=1;fib(1)=1;fib(n)=fib(n-1)+fib(n-2) 我试图用C编程中的if&else结构来解决这个问题。我成功地完成了它,并用一些小的输入进行了测试。当输入数字为“45”时,一切似乎都正常。然而,当输入“46”时,结果变为负数,这表明一定出了问题。 真的希望有人能告诉我为什么会这样,我做错了什么 源代码: 包括 这可能是由于int被签名,并在2e16-1之后变为负数 尝试使用无符号int。但是,即

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

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

源代码:

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

尝试使用
无符号int
。但是,即使这样做有效,您仍然受到限制,但是
int
最大大小


您可以尝试使用
unsigned long
unsigned long
double
来检查您的函数可以走多远。

它超出了
INT\u MAX
,可能是
+2147483647
,非常感谢。那么,有没有什么方法可以让我得到正确的答案(当输入数超过45时)?您需要使用
long long int
而不是
int
来扩展变量,但这需要C99标准。C不会检查您是否超出特定数据类型的范围。在您的机器上,第一位指示是否为负数。通常,一半的数字是负数,另一半是正数。斐波那契级数指数收敛。你可以用long作为例子,但是你很快就会遇到同样的问题。您可以很容易地测试这一点,方法是指定一个int,该int具有max positive整数值,然后向其添加1。你会发现你突然进入了活动范围。我会重新表述一下:但即使这有效,你仍然是有限的,但你的最大尺寸是int。收件人:但即使这样做有效,您仍在
[UINT\u MIN…UINT\u MAX]
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;
}