解析:  求斐波那契数列,就要用字符串来表示整数。需要注意的是每次要让原来的s1变为新的s2,但是s2一定要有足够的空间来存储。

   strcpy(s2,temp);当s2的空间小于temp将会产生无法想象的后果(深有体会)。

 1 #include <stdio.h>
 2 #include <string.h>
 3 static void large_add(void);
 4 static void initialize(int a);
 5 #define N 3000
 6 char *p2;
 7 char s1[N], s2[N],temp[N];
 8 char *p1;
 9 int main()
10 {
11     int a, n[3] = {0, 1, 1};
12     while(scanf("%d", &a) == 1){
13         initialize(a);
14         /*0, 1, 1, 2*/
15         if(a <= 2)
16             printf("%d\n", n[a]);
17         else{
18             a -= 2;
19             while(a--)
20                 large_add();
21             printf("%s\n", p1);
22         }
23     }
24     return 0;
25 }
26 /*计算字符串s1 + s2*/
27 static void large_add(void)
28 {
29     /*默认p1与p2均指向要相加的正确的位置*/
30     int i, t, t2;
31     int l1 = strlen(p1) - 1;
32     int l2 = strlen(p2) - 1;
33     char *p = p1 - 1;
34     strcpy(temp,p1);
35     t2 = l1 - l2;
36     *p = '0';
37     l1++;  
38     t = l1 - l2;         
39     for(i = l1; i - t >= 0; i--)
40         p[i] += p2[i - t] - '0';
41     /*相加与进位要分割开来*/
42     for(i = l1; i > 0; i--){
43         if(p[i] > '9'){
44             p[i] -= 10;
45             p[i-1]++;
46         }
47     }
48     if(*p == '0')
49         p++;
50     p1 = p;
51     p2 -= t2;        /*p2的空间顶多比原来的p1小一位*/
52     strcpy(p2,temp);
53 }
54 /*初始化字符串*/
55 static void initialize(int a)
56 {
57     /*令s1值为1,s2值为1*/
58     s1[N-2] = '1';
59     s2[N-2] = '1';
60     s1[N-1] = '\0';
61     s2[N-1] = '\0';
62     p1 = &s1[N-2];
63     p2 = &s2[N-2];
64 }