我有下面的C代码(请原谅我,如果语法不是按照C语言)打印给定索引的Fibonacci数。它工作正常。 但是我在这里有两个问题。第一个是,我想知道它可能会溢出的索引(假设16位编译器最大值int数据类型可以保持为65535)。第二个是当它溢出什么值时它会打印之后的索引?
我知道我的第一个问题全部取决于值N,但是我想知道是否可以预测给定索引n,如果它在我们计算索引n处的斐波纳契之前溢出/ p>
我的最后一个问题是我们如何确保它永远不会溢出给定值n的给定用户输入并打印正确的Fibonacci值。
public static int fib_loop(int n)
{
int[] fib = new int[n];
Scanf("%d",&n);
if(n==0)
fib[0] = 0;
if(n==1)
fib[1] = 1;
for (int i = 2; i < n; i++)
fib[i] = fib[i - 1] + fib[i - 2];
return fib[n-1]; //because we only want to return for index 4 in case if n =4 :-)
}
答案 0 :(得分:2)
如果您使用unsigned
变量,则定义溢出。给定fib(n-1)和fib(n-2)没有溢出,如果纤维(n)小于纤维(n-1),则纤维(n)溢出。
unsigned fib[n];
...
fib[i] = fib[i-1] + fib[i-2];
if (fib[i] < fib[i-1]) {
; // handle overflow
}
答案 1 :(得分:0)
OP说“我想知道是否有一种方法可以预测给定的指数N,如果它在溢出之前我们在指数N处计算斐波纳契”。
假设您的最大可表示数字为Big
。以封闭形式:
r = (1 + sqrt(5))/2
fib(x) = (power(r,x) - power(-r,-x))/sqrt(5)
or
fib(x) = floor(power(r,x)/sqrt(5) + 0.5)
让fib(x)设置为Big
,然后求解x。然后确保所有索引都是&lt; = x。
static size_t FibMaxIndex = 0;
if (FibMaxIndex == 0) {
FibMaxIndex = (size_t) (log(Big *sqrt(5) - 0.5)/log((1+sqrt(5))/2)) + 1;
}
if (index > FibMaxIndex) {
; //handle too large an index
}
答案 2 :(得分:0)
使用术语的渐近比率(golden ratio)来预测最大可表示数字的大小:
int biggest = (int)( Integer.MAX_VALUE / 1.618);
for (int i = 2; i < n; i++) {
if (fib[i - 1] > biggest)
// do something
fib[i] = fib[i - 1] + fib[i - 2];
}