2017-06-24 13 views
0

皆さん、皆さん、私が逃しているものを指摘してくれることを願っています。私はプログラミングに慣れていないので、プロジェクトオイラーの問題を解決しています。タスクの1つは、フィボナッチシーケンスの偶数の合計を計算することです。私は5つのテストのうち4つをパスしたコードを書いた。ここにあります:大きなフィボナッチ数の丸め

//N is input (N<=4*10^16), let's find n by Binet's formula 

double a = log10(sqrt (5) * N); 
double b = log10((1 + sqrt (5))/2); 
int n = (int) (a/b); 

//Using same formula, we find every Fibonacci number till n 
for (int i = 1; i <= n; i++){ 
    a = (1 + sqrt(5))/2; 
    long fiboNum = Math.round (Math.pow(a,i)/sqrt(5)); 

これは私の問題です。大きな数字のテストを実行すると、F(71)の周りに何らかの丸めが発生します。 私のコードでは、WolphramAlpha計算によるF(71)は308 061 521 170 130です。308 061 521 170 129.

このため、最終的な合計が間違っています。

また、私はすべての数字を印刷し、偶数が3を繰り返していることを認識します。しかし、それを3番目ごとに小さいループに単純化しても、問題は残っています。私は恐らくMath.roundを使用しない場合

、私は間違ったシーケンスを取得しています...

+0

2の53乗の後に、整数のために「double」がオフになります。 – Bathsheba

答えて

0

doubleは、限られた精度を持ちます。使用可能なメモリのサイズによってのみ制限される精度を持つBigDecimalを試してみてください。 Square root of BigDecimal in Java

pow():ここ

あなたはBigDecimal Sと平方根の計算方法ですJava's BigDecimal.power(BigDecimal exponent): Is there a Java library that does it?

丸め:加算と除算などのJava BigDecimal: Round to the nearest whole value

その他の操作がビルトインされているBigDecimalにメソッドとして。