【发布时间】:2014-04-03 19:38:13
【问题描述】:
在我下面的代码中,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;
}
}
【问题讨论】:
-
你能更清楚地解释你的问题吗?
-
当我测试你的 fib 函数时,我得到了这些结果:coliru.stacked-crooked.com/a/ca9428d07e1b8c11。 (有趣的是,这两个都是错误的结果)
-
解释是“整数溢出”。查一下。
-
sum=a+(2*b);-->sum=b+(2*a); -
正如 BLUEPIXY 所指出的,
fibnr正在计算错误的值,因此其结果不会与fibr的结果相同。 那是你的问题吗?请注意,您的帖子中没有一个实际的问题。在 SO 中提出一个好问题(而你的问题非常不好)的第一步是真正做到这一点。