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