现在的位置: 首页 > 综合 > 正文

hdu-1568

2014年02月19日 ⁄ 综合 ⁄ 共 857字 ⁄ 字号 评论关闭

(1)我们要知道斐波那契数列的通项公式:F[N]=(1/√5) * [((1+√5)/2)^N-((1-√5)/2)^N].

(2)对数log的强悍(以10为底):对两边取对数

logF[N]=-0.5*log5+log [((1+√5)/2)^N-((1-√5)/2)^N].

我们知道当N小于21的时候,斐波那契的数值不超过四位,而当N超过21时,((1-√5)/2)^N的值已经趋向于0了,我们可以不管这项。那么原式就可以化为:

logF[N]=-0.5*log5+N*log (1+√5)/2

把后面的记为K=-0.5*log5+N*log (1+√5)/2

那么  10^K=F[N];!!! 

举个例子:10^2.3=199.5262314.......

10^0.3=1.995262314.......

这样具体的数字很直观,对映到 10^K=F[N],取K的小数部分后,10^K就变为了科学计数的形式,那么此时你要取多少位就可以取多少位,就像要是你知道了10^0.3,那么你想得到1.995262314......的几位就几位!

#include<iostream>
#include<cstdio>
#include<cmath>
using namespace std;
int f[21]={0,1};
void init()
{
	for(int i=2;i<21;++i)
		f[i]=f[i-1]+f[i-2];
}
void solve(int n)
{
	double t=(1.0+sqrt(5.0))/2.0;  
    double k=-0.5*log10(5.0)+n*1.0*log10(t);  
    k-=(int)k;  
    double ans=pow(10.0,k);  
    while(ans<1000)  
        ans*=10;  
    printf("%d\n",(int)ans); 
}
int main()
{
	int n;
	init();
	while(scanf("%d",&n)!=EOF)
	{
		if(n<21)
			printf("%d\n",f[n]);
		else
			solve(n);
	}
	return 0;
}

  

抱歉!评论已关闭.