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 }