2016-03-05 107 views
3

好吧,我必須爲我的C++類做簡單的任務。兩個函數,第一個是斐波那契數列,第二個是隨機數列(發現e)。它看起來像這樣:C++處理大數據

#include <stdio.h> 
#include <cstdlib> 
#include <string> 
#include <math.h> 

void fib(int number) 
{ 
    int a=0, b=1; 
    printf("%d\n", a); 
    for (; number>0; number--) 
    { 
     printf("%d\n", b); 
     b+=a; 
     a = b-a; 
    } 
} 

void e_math(unsigned int number) 
{ 
    for (double n = 1; number>0; number--, n++) 
    { 
     printf("%f\n", pow((1+1/n), n)); 
    } 
} 

int main(int argc, char** argv) 
{ 
    if (std::string(argv[2])=="f") fib(atoi(argv[1])-1); 
    if (std::string(argv[2])=="c") e_math(atoi(argv[1])-1); 
    else printf("Bad argument\n"); 
} 

所以在最後我做g++ main.cpp -o app;./app 10 f。它工作完美。但是當我想:嗯,也許讓我們檢查一下更大的數字,然後加上50就搞砸了。我的意思是它確實有40個序列號(用Python進行檢查),但後來開始printf()底片等我認爲它可能是約int範圍。所以我改變int a=0, b=1long long a=0, b=1,但還是它打印相同的(我還在用printf("%d..),因爲%lld不起作用

+3

考慮使用''和'std :: cout'來顯示C++中的內容,而不是printf – GeoffreyB

+0

嘗試使用%I64d說明符。但你會得到相同的溢出問題,例如N = 100。 –

+1

'%lld'確實有效(至少在我的編譯器中)。 – fuenfundachtzig

回答

6

有評論中的信息告訴你如何能夠正確打印long long,以便您可以從整個範圍受益。然而,正如他在回答中所說的那樣,你不會再走得太遠(它將在無符號64位上循環94次)。

如果你想處理更大的斐波那契數字(實際上,任意大數),你可以使用boost::multiprecision

例如:

​​

你需要建立在符合GMP鏈接。例如:

g++ -o fib fib.cc -lgmp 
./fib 
139423224561697880139724382870407283950070256587697307264108962948325571622863290691557658876222521294125 
2

nFibonacci number約爲1.6^n這對於n=50是一個很大的數字(它53316291173)。你可能會能夠將其重新編號爲long,但隨着事物呈指數級增長,您將無法將Fn存儲爲原始數據類型(其中Fn表示第12個斐波納契數):第012個斐波納契數爲大約1.6乘以n斐波那契數。

您需要一個大的int數據類型來計算Fn大的n

+0

1.6^50遠小於2^63(因爲兩個值都較大,所以即使沒有計算也可以知道),因此很容易適應'int64_t'。 –

+0

是的,我剛剛意識到這一點。 :)但是這個東西呈指數增長,所以如果你稍微增加'n',它會變得太大。 – blazs

0

自%LLD是不可移植的,在任何編譯器不工作,怎麼樣,如果你聲明一個並且只要b和打印使用C++的std ::法院的結果呢?

這是必要的,因爲第50個Fibonacci數爲7778742049,比典型的最大正整數值越大(32位),也就是2147483647

順便說一句,你應該刪除過去的其他,當提供參數f時,我不認爲正在做你想做的事。

這是code的工作。