解析: 求斐波那契数列,就要用字符串来表示整数。需要注意的是每次要让原来的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 }