2

そこで、実行したい多くのフィボナッチ数をユーザーに尋ねる再帰的なプログラムを書きました。私が抱えている問題は、45番目の数字の後に、「-」が付いた数字と、その数字がシーケンスに収まらないことです。それを変更して適切な番号を取得するにはどうすればよいですか? 計算を実行するコードの再帰部分は次のとおりです。

void fibonacci (int a, int b, int n, int count)
{
    if(n < count) 
    {
        cout<<a+b<<endl;
        fibonacci(b, a+b, n+1, count);
    }
}

シーケンスの出力は次のとおりです。

How many numbers do you want the Fibonacci sequence to process: 50
The starting numbers for the sequence are: 0, 1
1
2
3
5
8
13
21
34
55
89
144
233
377
610
987
1597
2584
4181
6765
10946
17711
28657
46368
75025
121393
196418
317811
514229
832040
1346269
2178309
3524578
5702887
9227465
14930352
24157817
39088169
63245986
102334155
165580141
267914296
433494437
701408733
1134903170
1836311903
-1323752223
512559680
-811192543
-298632863
-1109825406

-# を実数に変更するには、どのような変更を加える必要がありますか?

4

4 に答える 4

9

使用しているデータ型 intが 32 ビットであり、最大 2^31-1 = 2147483647 の値しか保持できないため、問題が発生していますsigned(デフォルト、31 ビットが使用され、符号を示すために 1 ビットが占有されていますこれは、負の数)、2^32-1 = 4294967295 の場合unsigned。ここでは 64 ビット データ型を使用できますが (long longほとんどの場合)、後でこれを使用しても問題が発生します (94 番目のフィボナッチ数のあたりだと思います)。

この問題に対する「本当の」解決策は、独自の数値計算方法を作成し、数値の独自の表現 (文字の配列) を使用することです。「bignum」ライブラリを使用するさまざまな可能性の 1 つを探すこともできます。これに関する詳細については、 SO の質問 (たとえば、 this one ) を参照してください。

于 2011-03-31T17:07:00.613 に答える
1

変数を as として宣言するunsigned intと、もう少し対話を行うことができますが、とにかく問題が発生します。a を使用して変数のサイズを拡張してlong long intも、問題は遅延します。遅かれ早かれ、選択するデータ型が何であれ、表現できる最大数を超えるため、これを解決することはできません

于 2011-03-31T17:11:09.353 に答える
0

Int は 32 ビットのデータのみを保持し、最大値は 2,147,483,647 です。戻り値が「オーバーフロー」しています。64 ビットを保持し、最大値が 18,446,744,073,709,551,615 の ulong データ型を使用します。

于 2011-03-31T17:10:44.683 に答える