C ++处理大数字

时间:2016-03-05 12:20:04

标签: 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");
}

所以最后我做了g++ main.cpp -o app;./app 10 f。它工作得很好。但是,当我想:嗯,也许让我们检查更大的数字,并添加50它只是搞砸了。我的意思是它对大约40个序列号有好处(用Python检查),但随后它开始printf()个否定等等。我认为它可能大约是int范围。所以我将int a=0, b=1更改为long long a=0, b=1,但仍打印相同(我仍使用printf("%d..),因为%lld不起作用

4 个答案:

答案 0 :(得分:6)

评论中有信息告诉您如何正确打印long long,以便您可以从整个范围中受益。然而,正如他在回答中所说的那样,你将不会走得更远(它将在无符号64位上循环n = 94)。

如果你想处理更大的斐波纳契数(实际上是任意大数)你可以使用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

答案 1 :(得分:2)

n Fibonacci number大约1.6^nn=50是一个很大的数字(53316291173)。您可能能够将其重新表示为long,但随着事件以指数方式增长,您将无法将Fnn存储到基本数据类型中(其中Fn 1}}表示n斐波纳契数):n+1斐波纳契数约为n斐波纳契数的1.6倍。

您需要一个大的int数据类型来为大Fn计算n

答案 2 :(得分:2)

您可以使用The GNU Multiple Precision Arithmetic Library中的整数类。这是指向C++ Interface

的链接

修改:同时查看15.7.4 Fibonacci Numbers

答案 3 :(得分:0)

由于%lld不可移植并且在任何编译器中都不起作用,如果你声明 a b 并用c ++ std ::打印结果怎么办?清点?

这是必要的,因为第50个Fibonacci数是7778742049,它大于典型的最大正整数值(32位)2147483647。

顺便说一句,你应该删除最后的 else ,我不认为在提供参数f时你正在做你想做的事。

这是code工作。