簡體   English   中英

C ++處理大數字

[英]C++ Handling big numbers

好的,我必須為我的c ++類做簡單的任務。 兩個函數,首先是Fibonacci序列,第二個是隨機序列(找到e )。 它看起來像這樣:

#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不起作用

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

如果你想處理更大的Fibonacci數(事實上,任意大數)你可以使用boost :: multiprecision

例如:

#include <boost/multiprecision/gmp.hpp>  

boost::multiprecision::mpz_int fib(boost::multiprecision::mpz_int number)
{
    boost::multiprecision::mpz_int a=0, b=1;
    for (; number>0; number--)
    {
        b += a;
        a = b-a;
    }
    return a;
}

int main()
{
    std::cout << fib(500);
}

在構建時,您需要與gmp鏈接。 例如:

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

nFibonacci數約為1.6^nn=50是一個大數(它是53316291173 )。 您可能能夠long重新表示它,但隨着事物成倍增長,您將無法將大n Fn存儲到基本數據類型中(其中Fn表示第n個Fibonacci數): n+1 th斐波納契數約為第n個斐波那契數的1.6倍。

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

您可以使用GNU Multiple Precision Arithmetic Library中的 Integer類。 這里是C ++接口的鏈接。

編輯:另請參閱15.7.4斐波那契數字

由於%lld不可移植並且在任何編譯器中都不起作用,如果你聲明ab為long並用c ++ std :: cout打印結果怎么辦?

這是必要的,因為第50個Fibonacci數是7778742049,它大於典型的最大正整數值(32位)2147483647。

順便說一下,你應該刪除最后的其他內容 ,我不認為在提供參數f時你正在做你想做的事情。

這是代碼工作。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM