HDU 1568 Fibonacci
题解:首先,对于小于10000的斐波那契数,我们直接计算,当大于10000时,用公式,由于只要输出前四位,所以不用考虑浮点数的问题,算出其取log的结果:
tmp=(log(sq5/5)+n*log(0.5+sq5/2))/log(10.0)
然而为什么要取log呢,考虑这样的情况,若结果前四位为1493,那么计算的结果一定是log(10^n*1.493……)=log(1.493……)+n,那么只要减去整数部分,就得到log(1.493……),
将结果加3,得到log(1.493……)+3=log(1493.……),然后计算一下10的幂后取整就是结果了。
#include <cstdio> #include <cmath> using namespace std; int main(){ int fib[100],fibs; fib[0]=0,fib[1]=1; for(fibs=2;fib[fibs-1]<10000;fibs++)fib[fibs]=fib[fibs-1]+fib[fibs-2]; fibs-=2; int n; double sq5=sqrt(5); while(scanf("%d",&n)!=EOF){ if(n<=fibs)printf("%d\n",fib[n]); else{ double tmp=(log(sq5/5)+n*log(0.5+sq5/2))/log(10.0); tmp=tmp-int(tmp); printf("%d\n",(int)pow(10,tmp+3)); } } return 0; }
愿你出走半生,归来仍是少年