C 需要解释一下我的斐波那契程序吗
在下面的代码中,C 需要解释一下我的斐波那契程序吗,c,fibonacci,C,Fibonacci,在下面的代码中,fibr(n)和fibnr(n)都返回一个int。当n较小时,返回的值是正确的,但当n较大时,结果溢出,结果不再可靠。如果返回类型仍然是int,那么结果准确的n范围是多少?如果返回类型是unsigned、long、unsigned long、long或unsigned long,该怎么办 #include <stdio.h> #include <stdlib.h> int fibr (int n ) { // using recursive met
fibr(n)
和fibnr(n)
都返回一个int。当n
较小时,返回的值是正确的,但当n
较大时,结果溢出,结果不再可靠。如果返回类型仍然是int
,那么结果准确的n
范围是多少?如果返回类型是unsigned
、long
、unsigned long
、long
或unsigned 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;
}
}
#包括
#包括
int fibr(int n){//使用递归方法
如果(n==0)返回0;
如果(n==1),则返回1;
否则{
返回(纤维(n-1)+2*纤维(n-2));
}
}
内部光纤(内部网络){
int a=0;
int b=1;
如果(n==0),则返回a;
如果(n==1),则返回b;
否则{
整数和=0;
int i;
对于(i=2;i
因此,您只需检查“真实”斐波那契序列,并根据您决定选择的类型,查看输出何时会超出范围……使用“unsigned long long long”类型,您将达到序列的第93个数字,您必须采取其他措施。可能是一个可以处理大数字的库,也可能是一个切换到双精度的库(高达1.7e+/-308)。你能更清楚地解释你的问题吗?当我测试你的fib函数时,我得到以下结果:。(有趣的是,这两个结果都是错误的)解释是“整数溢出”。查一下。sum=a+(2*b);
-->sum=b+(2*a)
正如BLUEPIXY所指出的,fibnr
计算的值是错误的,所以它的结果不会与fibr
的结果相同。这就是你的问题所在吗?请注意,你的帖子中没有实际的问题。在这样的情况下制定一个好问题的第一步(你的问题非常不好)字节数和范围取决于编译器和体系结构,但这些结果对于针对x86和x64的VC++来说是准确的。这个问题已经稍微澄清了
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