2017-06-18 40 views
0

这个代码在n = 46后没有返回正确的答案。我能做些什么来解决这个问题以获得更高的第n项?斐波纳契迭代:找到n> 50的斐波那契数列的第n项

public static long fibonacciIterative(long n) 
    { 
     if(n <= 1) { 
    return n; 
      } 
     int x = 1; 
     int y = 1; 
     for(int i=2; i<n; i++) 
      { 
      int z = x; 
      x+= y; 
      y = z; 
      } 
     return x; 
} 

谢谢大家的好评。我在问完问题后立即找到了代码,我就明白了。

+1

开始通过改变'x','y'和'z'为'long' 。 – Eran

+1

提示:您认为“int”可以表示的最大数目是多少?斐波纳契数字超过46是多大? – lurker

+0

'int'将** - 2^31 **中的数字保存到** 2^31-1 **中,因为'int'由Java中的32位表示。任何斐波那契数n> 46的术语超出这些限制。你可以使用64位的“long”,并保存更大的数字。如果您需要超过“长”的限制,BigInteger会更大。 – Carlton

回答

3

这很可能是因为整数溢出。对于变量x,yz使用long

这会带给你更多一点,但最终也会溢出long范围。如果您还需要更大的号码,请拨打BigInteger

-1

最优化的方式,用的O(1)复杂性会比奈的公式,在Java中如下:

static long fibonacciBinet(long n) { 
    if (n <= 1) return n; 
    double sqrt5 = Math.sqrt(5); 
    long x = (long) ((Math.pow(1+sqrt5, n)-Math.pow(1-sqrt5, n))/(Math.pow(2, n)*sqrt5)); 

    return x; 
}