解析:  求斐波那契数列。

     s1:赋予两个字符串初始值1;

     s2:相加两个字符串,结果保留到第一个字符串,并将原来第一个字符串复制到现在的第二个字符串;

     s3:重复以上步骤,直到循环n次,每次将结果保留到字符串数组中;

     s4:接受数据,直接输出结果。

 1 #include <stdio.h>
 2 #include <string.h>
 3 static void large_add(void);
 4 static void initialize(void);
 5 #define N 3000
 6 static char *p2;
 7 static char s1[N], s2[N],temp[N];
 8 static char *p1;
 9 static char fei[5010][N];
10 int main()
11 {
12     int a, i;
13     initialize();
14     strcpy(fei[0],"0");
15     strcpy(fei[1],"1");
16     strcpy(fei[2],"1");
17     for(i = 3; i < 5010; i++){
18         large_add();
19         strcpy(fei[i],p1);
20     }
21     while(scanf("%d", &a) == 1){
22         printf("The Fibonacci number for %d is %s\n", a, fei[a]);
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(void)
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 }