您的位置:首页 > 其它

HDU 1568 Fibonacci

2012-08-28 16:58 351 查看
数学题,像我这种不擅数学者的悲哀

此题需要用到Fibonacci数列的通项公式:



也要利用对数的性质:

loga(b^c)=c*loga(b);

loga(b*c)=loga(b)+loga(c);

假设给出一个数1234567,那么log10(1234567)=log10(1.234567*10^6)=log10(1.234567)+6;

log10(1.234567)就是log10(1234567)的小数部分:

10^log10(1.234567)=1.234567


对Fibonacci数列取对数:



其中

log10(1-( (1-√5)/(1+√5)
)^n) 可以忽略。

那么题目的解决很容易就出来了

#include<iostream>
#include<cstdio>
#include<cmath>
using namespace std;
const double m=(sqrt(5.0)+1.0)/2.0;
const double t=-0.5*log10(5.0);
int main()
{
int n,c;
int f[21];
f[0]=0;f[1]=1;
for(int i=2;i<=20;i++)
f[i]=f[i-1]+f[i-2];
while(scanf("%d",&n)!=EOF)
{
if(n<=20) cout<<f
<<endl;
else
{
double temp= (t+n*log10(m));
c=(int) temp;
temp-=c;
temp=pow(10.0,temp);
while(temp<1000)
temp*=10;
printf("%d\n",(int)temp);
}
}
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: