使用C ++查找第1500000个Fib数

时间:2011-05-09 00:59:23

标签: c++ numbers int fibonacci

我写了下面的代码来找到第1500000个斐波纳契数(请忽略可怕的缩进,我在大约2分钟内写了这个)。我需要它作为一个字符串。这假设有用:

#include <cstdlib>
#include <iostream>
#include <sstream>
int i;
int b=1;
int c=2;
using namespace std;

int main(int argc, char *argv[])
{

    int fib=1500000;

for (i=1;i<fib-3;i++){
c=b+c;
b=c-b;
}
   stringstream ss;
   ss << c;
   string d=ss.str();
cout << d << endl;
    system("PAUSE");
    return EXIT_SUCCESS;
}

它经历了1500000-3次(每次超过3个数字) 我知道问题是这个数字很大,可以作为一个int包含。有没有办法让我存储它而不包含它作为int或文件(因为那将是非常低效)?如果是这样,我该怎么做?

2 个答案:

答案 0 :(得分:2)

使用Bignum library

答案 1 :(得分:1)

如果您需要精确的表单,可以使用与bignum库的其他重复关系之一:

fib(2*n) = fib(n)^2 + fib(n-1)^2
fib(2*n-1) = fib(n)*(2*fib(n-1)+fib(n))

哪个应该减少O(log(n))而不是O(n)所需的计算次数 您可以在此处查看基于此方法的伪代码:nth fibonacci number in sublinear time

注意,第n个斐波那契数需要大约n * log(phi)/ log(2)= n * 0.69二进制数来表示,因此1.5M ^的精确表示将需要大约130kb来表示二进制,或300kb作为字符串(约为2 ^(10000000)或10 ^(300000))


在大约n = 1500

时,双打溢出被移除

您可以使用以下双打直接执行此操作(改编自http://en.wikipedia.org/wiki/Fibonacci_number):

double fib( int n )
{
   static const SQRT_5 = sqrt(5.0);
   static const phi = (1.0+SQRT_5)/2.0;
   return floor( (pow(phi,n)/SQRT_5) + 0.5 );
}

虽然如果你需要每一个数字,这不会起作用。 (它只会给出第78个斐波纳契数的每个数字)