就是一道纯大数题,需要用到大数加法和大数比较。
一开始不知道哪里错了,后来改了改就A了。
#include <iostream>
#include <cstdlib>
#include <cstdio>
#include <cstring>
#include <cmath>
#include <algorithm>
#define MAXN 1005
#define ll long long
using namespace std;
int Judge(char* a,char* b) //a>b 返回1,a<b返回-1,相同返回0
{
int la=strlen(a),lb=strlen(b);
if(la>lb) return 1;
else if(la<lb) return -1;
else
{
for(int i=0; i<la; ++i)
if(a[i]>b[i]) return 1;
else if(a[i]<b[i]) return -1;
}
return 0;
}
void Add(char a[],char b[],char back[])
{
char c[MAXN]= {0};
int i=strlen(a)-1,j=strlen(b)-1,k=0;
int x,y,z,up=0;
while(i>=0||j>=0)
{
if(i<0) x='0';
else x=a[i];
if(j<0) y='0';
else y=b[j];
z=x-'0'+y-'0'+up;
c[k++]=z%10+'0';
if(z>9) up=1;
else up=0;
i--;
j--;
}
if(up) c[k++]='1';
c[k]=0;
for(k=k-1,i=0; k>=0; --k) back[i++]=c[k];
back[i]=0;
}
char f[MAXN][MAXN];
char a[MAXN],b[MAXN];
int N;
int main()
{
strcpy(f[1],"1");
strcpy(f[2],"2");
char big[MAXN]= {0};
big[0]='1';
for(int i=1; i<105; ++i)
big[i]='0';
big[103]=0;
for(int i=3;; ++i)
{
Add(f[i-1],f[i-2],f[i]);
N++;
if(Judge(f[i],big)>=0) break;
}
while(scanf("%s%s",a,b))
{
if(!strcmp(a,"0")&&!strcmp(b,"0")) break;
int ans=0;
bool note=false;
for(int i=1; i<=N; ++i)
{
if(Judge(f[i],b)>0) break;
if(!note&&Judge(f[i],a)>=0) note=true;
if(note) ans++;
}
printf("%d\n",ans);
}
return 0;
}