这道题太精辟了,一开始刚见到这道题木有一点思路,,,最后看看了别人的解题思路,,首先先用fibonacci公式求出其值,然后运用对数的性质,,去整取零,,,因为影响结果的只是小数部分,,,然后用小数部分一直乘10直到大于1000时停下,,,,
斐波纳契的计算公式:(1/√5) * [((1+√5)/2)^n-((1-√5)/2)^n](n=1,2,3.....)
log10((1/√5) * [((1+√5)/2)^n-((1-√5)/2)^n])
化简一下得到:
-0.5*log10(5.0)+((double)n)*log(f)/log(10.0)+log10(1-((1-√5)/(1+√5))^n)其中f=(sqrt(5.0)+1.0)/2.0;
在这里 log10(1-((1-√5)/(1+√5))^n)无穷小可以忽略不计!
最后得到 log10(an)=-0.5*log10(5.0)+((double)n)*log(f)/log(10.0) !
代码:
#include<iostream>
#include<cstdio>
#include<cmath>
using namespace std;
int s[21]={0,1,1,2};
const double f=((double)sqrt(5)+1)/2.0;
void get_Fibonacci(int x)
{
if(x<=20)
printf("%d\n",s[x]);
else{
double ans=(-0.5)*log(5.0)/log(10.0)+(double(x))*log(f)/log(10.0);
ans=ans-floor(ans);
double k=pow(10.0,ans);
while(k<1000.0)
k*=10.0;
printf("%d\n",(int)k);
}
}
int main(){
int x,i;
for(i=3;i<=20;i++)
s[i]=s[i-1]+s[i-2];
while(~scanf("%d",&x)){
if(x==0){
printf("0\n");
continue;
}
get_Fibonacci(x);
}
return 0;
}