解析: 又是一道变态题。首先求出前800项的斐波那契数列存储起来(以前求过,不多说了),在枚举比较就行了。
比较字符串的大小,不能光用strcmp函数,因为这个函数不过字符串的长短一律从左向右比较,也就是2比10大,
所有在用strcmp之前要先比较一下字符串的长短。
1 #include <stdio.h> 2 #include <string.h> 3 static void large_add(void); 4 static void initialize(void); 5 #define N 200 6 static char *p2; 7 static char s1[N], s2[N],temp[N]; 8 static char *p1; 9 static char feibo[800][N]; 10 int main() 11 { 12 int i, sum, l1, l2; 13 char ch1[N], ch2[N]; 14 initialize(); 15 strcpy(feibo[1],"1"); 16 for(i = 2; i < 800; i++){ 17 large_add(); 18 strcpy(feibo[i],p1); 19 } 20 while(scanf("%s %s", ch1, ch2) == 2 && (ch1[0] != '0' ||ch2[0] != '0')){ 21 sum = 0; 22 l1 = strlen(ch1); 23 for(i = 1; i < 800; i++){ 24 l2 = strlen(feibo[i]); 25 if(l1 > l2) 26 continue; 27 if(l1 < l2) 28 break; 29 if(strcmp(feibo[i],ch1) >= 0) /*找到启示位置*/ 30 break; 31 } 32 l1 = strlen(ch2); 33 for(; i < 800; i++){ 34 l2 = strlen(feibo[i]); 35 sum++; 36 if(l1 > l2) 37 continue; 38 if(l1 < l2) 39 break; 40 if(strcmp(feibo[i],ch2) > 0) /*找到终止位置*/ 41 break; 42 } 43 sum -= 1; 44 printf("%d\n", sum); 45 } 46 return 0; 47 } 48 /*计算字符串s1 + s2*/ 49 static void large_add(void) 50 { 51 /*默认p1与p2均指向要相加的正确的位置*/ 52 int i, t, t2; 53 int l1 = strlen(p1) - 1; 54 int l2 = strlen(p2) - 1; 55 char *p = p1 - 1; 56 strcpy(temp,p1); 57 t2 = l1 - l2; 58 *p = '0'; 59 l1++; 60 t = l1 - l2; 61 for(i = l1; i - t >= 0; i--) 62 p[i] += p2[i - t] - '0'; 63 /*相加与进位要分割开来*/ 64 for(i = l1; i > 0; i--){ 65 if(p[i] > '9'){ 66 p[i] -= 10; 67 p[i-1]++; 68 } 69 } 70 if(*p == '0') 71 p++; 72 p1 = p; 73 p2 -= t2; /*p2的空间顶多比原来的p1小一位*/ 74 strcpy(p2,temp); 75 } 76 /*初始化字符串*/ 77 static void initialize(void) 78 { 79 /*令s1值为1,s2值为1*/ 80 s1[N-2] = '1'; 81 s2[N-2] = '1'; 82 s1[N-1] = '\0'; 83 s2[N-1] = '\0'; 84 p1 = &s1[N-2]; 85 p2 = &s2[N-2]; 86 }