思路:
1)前20项没超过10000,直接递推出
2)首先我们知道fibonacci的通项公式:
然而这个得出来的数太大了。。。
有一种很巧妙的思路:
我们想要求出某个很大的数的前几位,比如求斐波那契数列第40项102334155的前6位,我们可以把
102334155化成1.02334155*10^8,然后把1.02334155这个数乘100000取整就可以了。这种方法可以求一个数的前任何位。
所以先对fn取对数,去掉整数部分(这里的整数部分是之后的幂所以去掉也不会影响结果)然后去其小数部分,得到temp,然后需要几位就去取ans = pow ( 10,temp )的几位小数就行了。
#include <iostream>
#include <cstdio>
#include <string.h>
#include <cmath>
typedef long long int li;
using namespace std;
int f[25];
int main(){
int n;
f[0] = 0;
f[1] = f[2] = 1;
for(int i = 3;i<=23;i++){
f[i] = f[i-1] + f[i-2];
}
while(~scanf("%d",&n)){
if(n < 21)
printf("%d\n",f[n]);
else{
double gw = sqrt(5);
double temp = log10(1.0/gw) + n * log10((1+gw)/2.0);
temp = temp - (int)temp;
double ans = pow(10,temp);
while(ans < 1000)
ans *= 10;
printf("%d\n",(int)ans);
}
}
}