【HDU 1568】Fibonacci 数论

题目地址

题意:求取第n项斐波那契数列的前4位数字,范围为1<=n<=100000000,不够四位的直接输出;

只要求求出前四位数字,可以用对数和斐波那契通项公式计算出近似值,取其前四位。

斐波那契数列通项公式:

对其进行变形:

转化为对数形式:

log10F(n)可以将原本数值巨大的斐波那契项值缩小至小数级,例如:

log10(12345678)=log10(1.2345678*10^7)=log10(1.2345678)+7;(7可以通过减去(int)log10(12345678)删去)

此时令 n=log10(1.2345678);

那么pow(10,n)=1.2345678;

然后就可以取得其前四位。

由于此种方法存在细小误差,因此数值较小时可以通过常规方式直接输出,前20位斐波那契数不超过四位数,以此作为分界点。

代码:

#include<iostream>
#include<cmath>
using namespace std;
int a[25];
double fun(int n)
{
	return log10(1/sqrt(5.0))+n*log10((1+sqrt(5.0))/2);
}
int main()
{
	int n,i;
	double s;
	a[1]=1;
	a[2]=1;
	for(i=3;i<=20;i++)
	a[i]=a[i-1]+a[i-2];
	while(cin>>n)
	{
		if(n<=20)
			cout<<a[n]<<endl;
		else
		{
			s=fun(n);
			s-=(int)s;
			s=pow(10,s);
			while(s<1000)
				s*=10;
			cout<<(int)s<<endl;
		}
	}
	return 0;
}

猜你喜欢

转载自blog.csdn.net/Xylon_/article/details/81482427