嘿嘿,先将每一个Fib打表,之后,就是很暴力的在区间内找咯。
#include<iostream> #include<algorithm> #include<string> #include<math.h> #define maxn 600 using namespace std; int sum[maxn+1][50],len1[maxn+1]; int a[50],b[50],la,lb; char str1[110],str2[110]; void init() { sum[0][0]=0;len1[0]=0; sum[1][0]=1;len1[1]=0; sum[2][0]=2;len1[2]=0; for(int i=3;i<=maxn;i++) { int k=0,j; for(j=0;j<=len1[i-2];j++) { int t=k+sum[i-1][j]+sum[i-2][j]; k=t/10000; sum[i][j]=t%10000; } while((j-1)!=len1[i-1]) { int t=k+sum[i-1][j]; k=t/10000; sum[i][j]=t%10000; j++; } while(k) { int t=k; k=t/10000; sum[i][j]=t%10000; j++; } len1[i]=j-1; } } int compare(int *s,int l,int num) { if(l>len1[num]) return 1; else if(l<len1[num]) return -1; for(int i=l;i>=0;i--) { //cout<<s[i]<<' '<<sum[num][i]<<endl; if(s[i]>sum[num][i]) return 1; else if(s[i]<sum[num][i]) return -1; } return 0; } void solve() { int t1=1; while(la<len1[t1])t1++;//找出第一个长度大于等于左区间Fib int i; for(i=t1;i<=maxn;i++)//找出第一个大于左区间的Fib { if(compare(a,la,i)<=0) break; } int j; for(j=i;j<=maxn;j++)//找出第一个大于右区间的Fib { if(compare(b,lb,j)<0) break; } printf("%d\n",j-i); } int main() { int n,len; init(); while(scanf("%s %s",str1,str2)==2) { if(strcmp(str1,"0")==0 && strcmp(str2,"0")==0) break; int s1=strlen(str1),s2=strlen(str2); la=lb=0; for(int i=s1-1;i>=0;i-=4)//将字符串转换为大数的存储方式,四位四位保存进整型数组 { int s=0; for(int j=0;j<4&&(i-j)>=0;j++) s+=(int)pow(10.0,j)*(str1[i-j]-'0'); a[la++]=s; } for(int i=s2-1;i>=0;i-=4) { int s=0; for(int j=0;j<4&&(i-j)>=0;j++) s+=(int)pow(10.0,j)*(str2[i-j]-'0'); b[lb++]=s; } la--;lb--; solve(); } return 0; }