之前一直用递推求斐波那契数列,今天算是记住了他的通项,只不过这道题有点迷啊,
推导过程,其中求完对数之后发现有一项计算量大且基本可以忽略,就删去这一项,带来的影响是前19项有偏差。。。,越往后偏差越小可以忽略,问题是这个规律需要自己去找,就很难受。。。但是这道题应该是想告诉我怎么处理一个数才能求得其前几位,和前面那道hdu1060一样,先通过求对数的方式可以求得其小数形式,然后再进行处理
其中斐波那契通项需要记住:
![](http://acm.hdu.edu.cn/forum/attachment/9_17558_66eb0d62d0d7087.jpg)
#include<iostream>
#include<cstring>
#include<cstdio>
#include<algorithm>
#include<vector>
#include<set>
#include<map>
#include<queue>
#include<cmath>
using namespace std;
int f[25];
void init()
{
f[0] = 0;
f[1] = 1;
for(int i = 2; i <= 20; i ++)
f[i] = f[i - 1] + f[i - 2];
}
int main()
{
init();
long long n;
while(scanf("%lld",&n) != EOF)
{
if(n <= 20)
{
printf("%d\n",f[n]);
continue;
}
double a = log10(1.0/sqrt(5.0))+n*log10((1+sqrt(5.0))/2);
a -= (int)a;
a = pow(10, a);
while(a < 1000)
{
a *= 10;
}
printf("%d\n",(int)a);
}
return 0;
}