C++处理大数字

min*_*234 3 c++ int long-integer

好的,我必须为我的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");
}
Run Code Online (Sandbox Code Playgroud)

所以最后我做到了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不工作

Col*_*rat 6

评论中有信息告诉您如何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);
}
Run Code Online (Sandbox Code Playgroud)

在构建时,您需要与gmp链接.例如:

g++ -o fib fib.cc -lgmp
./fib
139423224561697880139724382870407283950070256587697307264108962948325571622863290691557658876222521294125
Run Code Online (Sandbox Code Playgroud)