题目:计算Fib数列的第k个数。
分析:模拟,大整数运算。大整数加法,直接模拟即可,因为不超过1000位,所以算到Fib(5000)
1000 < lg(Fib(5000))<= lg(0.5(sqrt(5)+ 1)^ 5000 )<= 1045
#include <iostream>
#include <cstdlib>
#include <cstring>
#include <cstdio>
using namespace std;
int F[5005][2000];
int main()
{
memset( F, 0, sizeof(F) );
F[2][0] = F[1][0] = 1;
for ( int i = 3 ; i <= 5000 ; ++ i ) {
for ( int j = 0 ; j <= 1000 ; ++ j )
F[i][j] = F[i-2][j]+F[i-1][j];
for ( int j = 0 ; j <= 1000 ; ++ j )
if ( F[i][j] > 9 ) {
F[i][j+1] += F[i][j]/10;
F[i][j+0] %= 10;
}
}
int t;
while ( scanf("%d",&t) != EOF ) {
int end = 1000;
while ( end > 0 && !F[t][end] ) -- end;
while ( end >= 0 ) printf("%d",F[t][end --]);
printf("\n");
}
return 0;
}