2011-03-31 151 views
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 

做什麼樣的變化,我需要以使它改變 - #對真實的數字?

回答

9

你遇到了問題,因爲你使用datatypeint是32位,只能容納值高達2^31-1 = 2147483647時signed(默認情況下,使用31位,1位被佔用指示signedness,這也解釋了負數),2^32-1 = 4294967295時unsigned。你可以在這裏使用64位數據類型(大多數情況下爲long long),但也會在稍後發生問題(約94位斐波那契數,我認爲)。

這個問題的「真正」解決方案是編寫自己的數值計算方法,並使用自己的數字表示法f.e.一串字符。您還可以查找使用「bignum」庫的各種可能性之一。您應該在一些SO問題中找到關於此的更多信息,例如this one

+4

另外,最好使用'unsigned'類型來處理那些不能被是負面的。 – Xeo 2011-03-31 17:08:25

+0

順便說一句,考慮將負面表達的確切原因添加到您的答案,這使得它更完整。 – Xeo 2011-03-31 17:15:33

+0

@Xeo不依據大多數專家。無符號通常被理解爲意味着位操作或調製算術是必需的。 – 2011-03-31 17:18:10

0

只能保存32位數據,最大值爲2,147,483,647。您的返回值是「溢出」。使用ulong數據類型,其中包含64位,最大值爲18,446,744,073,709,551,615。

1

聲明你的變量爲unsigned int將允許你做更多的交互,但是你會遇到問題。使用long long int擴展變量的大小仍然會延遲您的問題。你不能解決這個問題,因爲遲早你會超過你可以表示的最大數量,無論你選擇哪種數據類型

+0

或者你會用完內存。 BigInt的某些實現將允許「無限」的精度,但最終「無限」永遠不會大於可用內存的數量。 – 2011-03-31 17:19:29