思路简单,打表知斐波拉切数列的第480项有101位。所以先把数列存在数组中,再用自定义的比较函数查找就行了。如果数据多的话还可以写成二分查找。
/** **author :Skylon ** ╭︿︿︿╮ {/ A C /} ( (oo) ) ︶︶︶ ** ** **UVA_10183||POJ_2413||ZOJ_1962||HDU_1316题** ** 2014 年 7月 21日** **/ #include <cmath> #include <queue> #include <stack> #include <vector> #include <cstdio> #include <string> #include <cctype> #include <climits> #include <cstring> #include <cstdlib> #include <iostream> #include <algorithm> using namespace std; int FB[501][200]; int compare(int *x,int *y,int cd)//自定义的比较函数 { int len; for (len=199;len>=0;len--) { if (y[len]!=0) { break; } } len+=1; if (cd<len) { return -1; } else if (cd>len) { return 1; } else { for (int i=0;i<len;i++) { if (x[i]<y[len-i-1]) { return -1; } if (x[i]>y[len-i-1]) { return 1; } } return 0; } } int main() { //freopen("Input.txt","r",stdin); // freopen("Output.txt","w",stdout); // system("color 5b"); memset(FB,0,sizeof(FB));//打表哦! FB[1][0]=1; FB[2][0]=2; FB[3][0]=3; for (int i=4;i<500;i++) { for (int j=0;j<200;j++) { FB[i][j]+=FB[i-1][j]+FB[i-2][j]; } for (int k=0;k<200;k++) { if (FB[i][k]>9) { FB[i][k]%=10; FB[i][k+1]+=1; } } } char a[200],b[200]; while (1) { scanf("%s%s",a,b); if (strcmp(a,"0")==0&&strcmp(b,"0")==0) break; int A[200],B[200]; int len1=strlen(a); int len2=strlen(b); for (int i=0;i<len1;i++) { A[i]=a[i]-'0'; } for (int i=0;i<len2;i++) { B[i]=b[i]-'0'; } int s1,s2; for (int i=1;i<500;i++)//从前往后找,找到第一个大于等于a的 { if (compare(A,FB[i],len1)<=0) { s1=i; break; } } for (int i=499;i>=0;i--)//从后往前找,找到第一个小于等于b的 { if (compare(B,FB[i],len2)>=0) { s2=i; break; } } printf("%d\n",s2-s1+1);//输出s2-s1,与样例相比差个1,然后加1 } return 0; }