您的位置:首页 > 其它

hdu 1568 Fibonacci

2013-03-29 10:55 337 查看
hdu 1568 Fibonacci                     题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1568

数学题

题目大意:中文不解释

题目分析:数很大,但好在只求前四位。可将这个大数在求出之前就表示为以10为底这个数的对数,将其整数部分砍掉(即把这个数除了10的很多倍)再用pow(10,结果)得到原数被除之后的结果,屡次*10直到满足四位即可输出。前20个单独处理,是因为式子中有应被忽略的高阶无穷小,前20误差太大。

#include<stdio.h>
#include<math.h>
//const double f=(sqrt(5.0)+1.0)/2.0;
int F[21]={0,1,1};
int main()
{
int n,i;
double p;
for(i=3;i<21;i++)
{
F[i]=F[i-1]+F[i-2];
}
while(scanf("%d",&n)!=EOF)
{
if(n<21)
{
printf("%d\n",F
);
continue;
}
p=-0.5*log10(5)+n*log10((sqrt(5.0)+1.0)/2.0);
p-=floor(p);
p=pow(10,p);
while(p<1000)p*=10;
printf("%d\n",(int)p);
}
return 0;
}


PS:参考大神的思路,有很多收获

log(n)=ln(n);

log10(n)=lg(n);

loga(n)=以a为底n的对数;

FIbonacci通项公式;

对数运算法则;
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: