1 /******************************求大数积*********************************/ 2 /*函数的功能: 3 实现两个表示整数的字符串的乘法运算,并将结果保留到新的字符串中。 4 */ 5 /*函数的条件: 6 */ 7 #include <stdio.h> 8 #include <string.h> 9 10 #define N 500 /*结果长度少于500的乘法计算*/ 11 12 static char s1[N], s2[N]; /*要相乘的两个字符串*/ 13 static char t[N]; /*存储中间结果的字符串*/ 14 static char s[N]; /*最终的结果*/ 15 static int l; /*每次都要相乘的字符串s1的长度*/ 16 /*关于全局变量,对于以后的程序设计,我自有使用的分寸,处理好变量的生命期的问题*/ 17 /*程序设计既要自主设计,也要学习别人的经验——模仿设计*/ 18 /*学习的秘诀在于获取别人现成的经验*/ 19 20 static void large_multiply(void); 21 static void digit_multiply(int a, int p); 22 /***********************************************************************/ 23 static void large_multiply(void) 24 { 25 /*默认s1与s2均指向要相加的正确的位置*/ 26 int i, l2; 27 char *p; 28 if(strcmp(s1,"0") == 0 || strcmp(s2,"0") == 0){ 29 strcpy(s, "0"); 30 return; 31 } 32 33 for(i = 0; i < N; i++) /*s要进行累加中间字符串t,所以要先制空*/ 34 s[i] = '0'; 35 s[N-1] = '\0'; 36 l = strlen(s1) - 1; 37 l2 = strlen(s2); 38 for(i = 0; s2[i]; i++){ 39 digit_multiply(s2[i] - '0',l2 - i); 40 } 41 for(i = 0; i < N; i++) 42 if(s[i] != '0'){ 43 p = &s[i]; 44 break; 45 } 46 strcpy(s,p); 47 } 48 static void digit_multiply(int a, int p) 49 { 50 int i, j, temp; 51 for(i = 0; i < N; i++) 52 t[i] = '0'; 53 t[N-1] = '\0'; 54 for(i = l, j = N - 1 - p; i >= 0; i--){ 55 temp = (s1[i] - '0') * a; 56 t[j] += temp % 10; 57 t[j-1] += temp / 10; 58 if(t[j] > '9'){ 59 temp = t[j] - '0'; 60 t[j] = temp % 10 + '0'; 61 t[j-1] += temp / 10; 62 } 63 j--; 64 } 65 for(i = N - 2; i >= 0; i--){ 66 s[i] += t[i] - '0'; 67 if(s[i] > '9'){ 68 s[i] -= 10; 69 s[i-1]++; 70 } 71 } 72 } 73 /*********************************************************************/ 74 int main() 75 { 76 while(scanf("%s %s", s1, s2) == 2){ 77 large_multiply(); 78 printf("%s\n", s); 79 } 80 return 0; 81 }