我写了下面的代码来找到第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或文件(因为那将是非常低效)?如果是这样,我该怎么做?
答案 0 :(得分:2)
答案 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个斐波纳契数的每个数字)