这题就是高精度问题,再加上一个斐波那契数列的打表,难点在高精度上,其他的还好吧
代码如下
#include<stdio.h>
#include<string.h>
void add(char s1[],char s2[],int i,char fib[][105]);
void main()
{
char a[105],b[105],fib[1000][105];
int lena,lenb,lenf,count,i;
strcpy(fib[1],"1");
strcpy(fib[2],"2");
while(1)
{
count=0 ;
scanf("%s %s",a,b);
if(a[0]=='0'&&b[0]=='0')
break;
else
{
lena=strlen(a);
lenb=strlen(b);
for(i=1;i<1000;i++)
{
if(i>=3)
add(fib[i-2],fib[i-1],i,fib);
lenf=strlen(fib[i]);
if(lenf>lenb||(lenf==lenb&&strcmp(b,fib[i])<0))
break;
if(lenf>lena||(lenf==lena&&strcmp(fib[i],a)>=0))
count++;
}
printf("%d\n",count);
}
}
}
void add(char s1[],char s2[],int i,char fib[][105])
{
int lens1,lens2,maxlen,j,k,a[105]={0},b[105]={0},c[105]={0};
lens1=strlen(s1);
lens2=strlen(s2);
maxlen=lens1>lens2?lens1:lens2;
for(j=0;j<lens1;j++)
a[j]=s1[lens1-j-1]-'0';
for(j=0;j<lens2;j++)
b[j]=s2[lens2-j-1]-'0';
for(j=0;j<maxlen+2;j++)
{
c[j]+=(a[j] + b[j]);
c[j+1]+= c[j] / 10;
c[j]=c[j] % 10;
}
while(c[j]==0)
j--;
for(k=0;k<=j;k++ )
{
fib[i][k]=c[j-k]+'0';
}
fib[i][k] = '\0';
}