2016-03-05 101 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的工作。