首先说一下乘法计算的算法,从低位向高位乘,在竖式计算中,我们是将乘数第一位与被乘数的每一位相乘,记录结果,之后,用第二位相乘,记录结果并且左移一位,以此类推,直到计算完最后一位,再将各项结果相加,得出最后结果。
计算的过程基本上和小学生列竖式做乘法相同。为了编程方便,并不急于处理进位,而是将进位问题留待最后统一处理。
总结一个规律: 即一个数的第i 位和另一个数的第j 位相乘所得的数,一定是要累加到结果的第i+j 位上。这里i, j 都是从右往左,从0 开始数。
ans[i+j] = a[i]*b[j];
另外注意进位时要处理,当前的值加上进位的值再看本位数字是否又有进位;前导清零。
#include<stdio.h>
2 #include<string.h>
3
4 #define MAX 1000 // 大数的最大位数
5
6
7 /*
8 大数乘法
9 参数:
10 num1为第一个因数,用字符数组保存
11 num2为第二个因数
12 sum数组保存相乘的结果 即:num1*num2=sum
13 返回值:返回数组sum的有效长度,即计算结果的位数
14 */
15 int Multiplication(char num1[],char num2[], int sum[])
16 {
17 int i, j, len, len1, len2;
18 int a[MAX+10] = {0};
19 int b[MAX+10] = {0};
20 int c[MAX*2+10] = {0};
21
22 len1 = strlen(num1);
23 for(j = 0, i = len1-1; i >= 0; i--) //把数字字符转换为整型数
24 a[j++] = num1[i]-'0';
25 len2 = strlen(num2);
26 for(j = 0, i = len2-1; i >= 0; i--)
27 b[j++] = num2[i]-'0';
28
29 for(i = 0; i < len2; i++)//用第二个数乘以第一个数,每次一位
30 {
31 for(j = 0; j < len1; j++)
32 {
33 c[i+j] += b[i] * a[j]; //先乘起来,后面统一进位
34 }
35 }
36
37 for(i=0; i<MAX*2; i++) //循环统一处理进位问题
38 {
39 if(c[i]>=10)
40 {
41 c[i+1]+=c[i]/10;
42 c[i]%=10;
43 }
44 }
45
46 for(i = MAX*2; c[i]==0 && i>=0; i--); //跳过高位的0
47 len = i+1; // 记录结果的长度
48 for(; i>=0; i--)
49 sum[i]=c[i];
50 return len;
51 }
52
53 int main()
54 {
55 int i, len;
56 int sum[MAX*2+10] = {0}; // 存放计算的结果,低位在前,高位在后,即sum[0]是低位
57 char num1[] = "123456789123456789"; // 第一个大数
58 char num2[] = "123456789123456789"; // 第二个大数
59 len = Multiplication(num1, num2, sum);
60 // 输出结果
61 printf("%s\n *\n%s\n =\n", num1, num2);
62 for(i = len-1; i>=0; i--)
63 printf("%d", sum[i]);
64 printf("\n");
65 return 0;
66 }