解析: 求斐波那契数列。
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 }