我正在尝试生成Fibonacci系列并提供以下相同的代码。当我为较小的值运行此代码时,它会输出正确的结果。但是,当我尝试计算一个数字为'50'的系列时,它会将正确的结果输出到第47个数字,而48,49和50个结果的结果是不正确的。我尝试使用unsigned long int,但它没有更正结果。有人可以在这里建议我做错了什么。 谢谢。
#include<stdio.h>
unsigned long long int fibr(unsigned long long int);
int main(){
unsigned long long int n;
printf("Enter a number\n");
scanf("%llu",&n);
//res=fibr(n);
while(n>=0){
printf("%llu\n",fibr(n));
n--;
}
}
unsigned long long int fibr(unsigned long long int n){
if((n==0)||(n==1))
return n;
else return fibr(n-1)+fibr(n-2);
}
'建议之后,我整合了unsigned long long int。修改了上面的代码,但现在它给出了一个seg错误。请给我任何提示。除了可用的标准之外,我不允许使用任何其他库。 “
答案 0 :(得分:2)
您是否尝试使用unsigned long long
?
答案 1 :(得分:1)
以下是第二个问题的答案:
我认为你从一开始就遇到了这个问题:
while(n>=0){
是一个无限循环,因为n
是无符号整数。由于减少,n
将变为负数。但是由于它是无符号的,它会回绕并导致递归中的堆栈溢出。
此外,您的算法可能是执行此操作的最慢方法。它以指数时间运行。因此,当n
很大时,运行它需要很长时间。
更好的方法是:
int n = 48;
return (unsigned long long)(pow(1.6180339887498948,n) * 0.44721359549995794 + 0.5);
此方法将在恒定时间内运行。 :)
答案 2 :(得分:0)
C数据类型的大小有限。因此,如果您使用int
,long
或long long
,由于斐波那契数字的快速增长特性,您的结果将会溢出。
要存储这么大的数字,您需要一些BigInteger
实现。为此,请查看“BigInt” in C?。
答案 3 :(得分:0)
你得到整数溢出。对于unsigned int
,最大可能值为4294967295,但第48个斐波纳契数为4807526976。
答案 4 :(得分:0)
将fibr()
转换为memoize其结果会将fibr(90)的运行时间缩短到几毫秒。从递归切换到迭代应该有类似的结果。