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[n]);
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通项公式;
对数运算法则;