您的位置:首页 > 其它

HDU 1568 Fibonacci

2017-12-05 21:06 281 查看

HDU 1568 Fibonacci

先看对数的性质,loga(bc)=c∗loga(b),loga(b∗c)=loga(b)+loga(c);

假设给出一个数10234432,那么log10(10234432)=log10(1.0234432∗107)=log10(1.0234432)+7;

log10(1.0234432)就是log10(10234432)的小数部分.

log10(1.0234432)=0.010063744

100.010063744=1.023443198

那么要取几位就很明显了吧~

先取对数(对10取),然后得到结果的小数部分bit,pow(10.0,bit)以后如果答案还是<1000那么就一直乘10。

注意偶先处理了0~20项是为了方便处理~

这题要利用到数列的公式:an=(1/√5)∗[((1+√5)/2)n−((1−√5)/2)n](n=1,2,3.....)



取完对数



log10(an)=−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)趋近于0

所以可以写成log10(an)=−0.5∗log10(5.0)+((double)n)∗log(f)/log(10.0);

最后取其小数部分。

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