题意是求Fibonacci数列的前四位数
解题思路:标准的Fibonacci数列F(0) = 0, F(1) = 1, F(n) = F(n-1) + F(n - 2)。
通项公式为F(n) = (((1+Sqrt(5))/2)^n - ((1-Sqrt(5))/2)^n)*1/Sqrt(5),因为(1-sqrt(5))/2的绝对值小于1,所以当i较大的时候,往往可以忽略掉这一项F(n)≈((1+Sqrt(5))/2)^n/sqrt(5)。
所以Fibonacci前30项可直接求出。后面的大数取log10,取整后求出左边4位,方法和HDOJ1060类似
#include<iostream>
#include<cmath>
using namespace std;
int main()
{
int n;
int i;
int f[31];
double temp1=log10((1.0+sqrt(5.0))/2.0),temp2=log10(sqrt(5.0));
f[0]=0;
f[1]=1;
for(i=2;i<31;i++)
f[i]=f[i-1]+f[i-2];
while(scanf("%d",&n)!=EOF)
{
if(n<31)
{
int temp=f[n];
while(temp>=10000)
temp/=10;
printf("%d\n",temp);
}
else
{
double t;
int ans;
t=(n*temp1-temp2);
t-=(__int64)t;
ans=pow(10.0,t)*1000.0;
printf("%d\n",ans);
}
}
return 0;
}