给你一个数n,让你求Fibonacci数的第n项的前四项和后四项,没有八项的只输出前四项。
思路:后四项容易求,两种方法,一种构造矩阵,一种求其周期。。。关键是前四项用到了Fibonacci 公式
代码:
#include<iostream>
#include<cstdio>
#include<string.h>
#include<cmath>
#define I (1.0+sqrt(5.0))/2
#define M 10000
using namespace std;
typedef long long L;
typedef struct str
{ L s[2][2];
}Node;
Node a,b,c;
inline void init()
{ a.s[0][0]=0;a.s[0][1]=1;
a.s[1][0]=1;a.s[1][1]=1;
b.s[0][0]=1;b.s[0][1]=0;
b.s[1][0]=0;b.s[1][1]=1;
c.s[0][0]=1;c.s[0][1]=1;
c.s[1][0]=0;c.s[1][1]=0;
}
Node ceil(Node p,Node q)
{ Node aa;
memset(aa.s,0,sizeof(aa.s));
for(int i=0;i<2;++i)
for(int j=0;j<2;++j)
for(int t=0;t<2;++t)
aa.s[i][j]=(aa.s[i][j]+p.s[i][t]*q.s[t][j])%M;
return aa;
}
Node doit(int k)
{
Node p=b,q=a;
while(k)
{ if(1&k) p=ceil(p,q);
q=ceil(q,q);
k=k>>1;
}
p=ceil(c,p);//运算不能交换
return p;
}
int main()
{
int f[40]={0,1};
for(int i=2;i<40;++i)
f[i]=f[i-1]+f[i-2];
init();
int n;
while(~scanf("%d",&n))
{
if(n<40)
{ printf("%d\n",f[n]);
continue;
}
int k=n-2;
Node bb=doit(k);
double ans=-0.5*(log10(5.0))+n*log10(I);
ans-=(int)ans;
ans=pow(10.0,ans);
while(ans<1000)
ans*=10.0;
printf("%d...",(int)ans);
printf("%04d\n",bb.s[0][1]);//不满足四位的前加0
int mm=5;
}return 0;
}