在下面的代码中,fibr(n)
和fibnr(n)
各自返回一个int。当n
较小时,返回的值是正确的,但当n
较大时,结果会溢出,结果不再可靠。如果返回类型仍为int
,那么结果准确的n
范围是多少?如果返回类型为unsigned
,long
,unsigned long
,long long
或unsigned long long
,该怎么办?
#include <stdio.h>
#include <stdlib.h>
int fibr (int n ) { // using recursive method
if (n==0) return 0 ;
else if (n==1) return 1;
else {
return (fibr(n-1)+2*fibr(n-2));
}
}
int fibnr (int n ) {
int a=0;
int b=1;
if (n==0) return a;
else if (n==1) return b;
else {
int sum=0 ;
int i ;
for (i=2;i<=n;i++) {
sum=a+(2*b);
a=b;
b=sum;
}
return sum;
}
}
答案 0 :(得分:1)
Type Name | Bytes | Ranges of Values
-------------------------------------------------------------------
integer | 4 | –2,147,483,648 to 2,147,483,647
| |
unsigned integer | 4 | 0 to 4,294,967,295
| |
long integer | 4 | –2,147,483,648 to 2,147,483,647
| |
unsigned long integer | 4 | 0 to 4,294,967,295
| |
long long | 8 | –9,223,372,036,854,775,808 to 9,223,372,036,854,775,807
| |
unsigned long long | 8 | 0 to 18,446,744,073,709,551,615
所以你只需要检查“真正的”斐波那契序列,看看你的输出何时超出范围,这取决于你决定选择哪种类型......使用“unsigned long long”类型你可以达到第93位除了你必须采取别的东西之外的序列号。也许是一个可以处理大数字的库,或者你可以切换到双倍(最多1.7e +/- 308)。