思路:
//hdu1316
由于a,b的范围(0,10的100次方)先用数组对大数进行储存一下,求在a,b的范围内有多少项斐波那契数,先用二维数组进行存储
然后求出a,b这两个数的长度,然后遍历二维数组中存储的斐波那契的长度直到找到大于a的长度的那一项跳出来,然后判断前一项如果
长度等于a且等于a,则count++,,,,然后同理,,直到遍历到大于b的长度
代码:
#include<stdio.h>
#include<string.h>
long s[10000][200]={0};
char t[10000][200];
int main()
{
char a[200],b[200];
long i,j,n,m,count,k;
s[1][0]=1;
s[2][0]=2;
k=0;
for(i=3;i<10000;i++)
for(j=0;j<200;j++)
{
k+=s[i-1][j]+s[i-2][j];
s[i][j]=k%10;
k/=10;
}
while(k&&j<200)
{
s[i][j++]=k%10;
k/=10;
}
for(i=10000-1;i>=1;i--)
{
k=0;
for(j=200-1;j>=0;j--)
if(s[i][j]!=0)
break;
for(;j>=0;j--)
t[i][k++]=s[i][j]+48;
t[i][k]=‘\0‘;
}
while(scanf("%s%s",a,b)>0)
{
count=0;
n=strlen(a);
m=strlen(b);
if(a[0]==‘0‘&&b[0]==‘0‘)
break;
for(i=1;strlen(t[i])<n;i++);
while(1)
{
if(strlen(t[i])==n)
{
if(strcmp(t[i],a)<0)
i++;
else
break;
}
else
break;
}
for(;i<10000;i++)
{
if(strlen(t[i])<m)
count++;
else
if(strlen(t[i])==m)
{
if(strcmp(t[i],b)<=0)
count++;
else
break;
}
else
break;
}
printf("%ld\n",count);
}
return 0;
}