解析:  又是一道变态题。首先求出前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 }