题目链接:How Many Fibs? UVA - 10183
题目大意:给出a、b两个数,求a、b之间斐波那契数的个数。
先打表斐波那契数列,然后寻找a、b之间的斐波那契数个数。
#include <iostream>
#include <cstdio>
#include <cstring>
using namespace std;
const int M=5e2+10;
const int N=1e2;
int f[M+5][N+5],a[N+5],b[N+5];
char s1[N+5],s2[N+5];
int cmp(const int *x,const int *y)
{
for(int i=N;i>=0;i--)
if(x[i]!=y[i])
return x[i]-y[i];
return 0;
}
int main()
{
f[0][0]=f[1][0]=1;
for(int i=2;i<=M;i++)
{
for(int j=0;j<=N;j++)
f[i][j]=f[i-1][j]+f[i-2][j];
for(int j=0;j<=N;j++)
f[i][j+1]+=f[i][j]/10,f[i][j]%=10;
}
while(~scanf("%s%s",s1,s2))
{
if(s1[0]=='0'&&s2[0]=='0')
break;
memset(a,0,sizeof(a));
memset(b,0,sizeof(b));
int la=strlen(s1);
for(int i=0;i<la;i++)
a[la-1-i]=s1[i]-'0';
int lb=strlen(s2);
for(int i=0;i<lb;i++)
b[lb-1-i]=s2[i]-'0';
int cnt1=0;
for(int i=1;i<=M;i++)
if(cmp(f[i],a)<0)
cnt1++;
else
break;
int cnt2=cnt1;
for(int i=cnt1;i<=M;i++)
if(cmp(f[i],b)<=0)
cnt2++;
else
break;
printf("%d\n",cnt2-cnt1-1);
}
return 0;
}