题意:求取第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;
}