2017-06-18 2 views
0

このコードは、n = 46の後に正解を返しません。これを修正してより高いn項を得るにはどうすればよいですか?フィボナッチ反復:n> 50のフィボナッチ数列の第n項を求めるには0

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

スタート。 – Eran

+1

ヒント: 'int'が表現できる最大数は何だと思いますか?フィボナッチの数字はどれくらい大きく、46を超えていると思いますか? – lurker

+0

'int'は** - 2^31 **から** 2^31-1 **までの数を保持します。これは' int'がJavaでは32ビットで表されるためです。フィボナッチ数n> 46の項は、これらの制限を超えています。 64ビットで長い数字を保持する 'long'を使うことができます。 'BigInteger'は、' long'の限界を超える必要がある場合、さらに大きくなります。 – Carlton

答えて

3

これは、整数のオーバーフローの可能性が高いためです。変数x,yおよびzにはlongを使用してください。

これは少し先に進んでいますが、最終的にはlongの範囲をオーバーフローします。まだ大きい数字が必要な場合はBigIntegerに行きます。

-1

O(1)の複雑さとの最適な方法は、次のようにJavaであるビネーのフォーミュラ、次のようになります。long` `へ 'X'、` y`と `z`を変更することにより、

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; 
} 
関連する問題