如何在斐波纳契系列中找到溢出的索引

时间:2013-09-07 17:21:21

标签: java algorithm

我有下面的C代码(请原谅我,如果语法不是按照C语言)打印给定索引的Fibonacci数。它工作正常。 但是我在这里有两个问题。第一个是,我想知道它可能会溢出的索引(假设16位编译器最大值int数据类型可以保持为65535)。第二个是当它溢出什么值时它会打印之后的索引?

我知道我的第一个问题全部取决于值N,但是我想知道是否可以预测给定索引n,如果它在我们计算索引n处的斐波纳契之前溢出

我的最后一个问题是我们如何确保它永远不会溢出给定值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 :-)
    }

3 个答案:

答案 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];
}