(1)我们要知道斐波那契数列的通项公式:F[N]=(1/√5) * [((1+√5)/2)^N-((1-√5)/2)^N].
(2)对数log的强悍(以10为底):对两边取对数
logF[N]=-0.5*log5+log [((1+√5)/2)^N-((1-√5)/2)^N].
我们知道当N小于21的时候,斐波那契的数值不超过四位,而当N超过21时,((1-√5)/2)^N的值已经趋向于0了,我们可以不管这项。那么原式就可以化为:
logF[N]=-0.5*log5+N*log (1+√5)/2
把后面的记为K=-0.5*log5+N*log (1+√5)/2
那么 10^K=F[N];!!!
举个例子:10^2.3=199.5262314.......
10^0.3=1.995262314.......
这样具体的数字很直观,对映到 10^K=F[N],取K的小数部分后,10^K就变为了科学计数的形式,那么此时你要取多少位就可以取多少位,就像要是你知道了10^0.3,那么你想得到1.995262314......的几位就几位!
#include<iostream> #include<cstdio> #include<cmath> using namespace std; int f[21]={0,1}; void init() { for(int i=2;i<21;++i) f[i]=f[i-1]+f[i-2]; } void solve(int n) { double t=(1.0+sqrt(5.0))/2.0; double k=-0.5*log10(5.0)+n*1.0*log10(t); k-=(int)k; double ans=pow(10.0,k); while(ans<1000) ans*=10; printf("%d\n",(int)ans); } int main() { int n; init(); while(scanf("%d",&n)!=EOF) { if(n<21) printf("%d\n",f[n]); else solve(n); } return 0; }