高精度乘法

 1 #include<cstdio>
 2 #include<algorithm>
 3 #include<iostream>
 4 #include<cmath>
 5 #include<cstring>
 6 using namespace std;
 7 int main()
 8 {
 9     char a[100005],b[100005];
10     int aa[100005],bb[100005],cc[100005],lena,lenb,lenc,i,j,x;
11     memset(aa,0,sizeof(aa));
12     memset(bb,0,sizeof(bb));
13     memset(cc,0,sizeof(cc));
14     gets(a);
15     gets(b);
16     lena = strlen(a);
17     lenb = strlen(b);
18     for(i = 0;i <= lena - 1;i++)
19         aa[lena - i] = a[i] - 48;
20     for(i = 0;i <= lenb - 1;i++)
21         bb[lenb - i] = b[i] - 48;
22     for(i = 1;i <= lena;i++)//设立内外层循环依次枚举一个乘数的一个数字和另一个乘数的每一个数字相乘。
23     {
24         x = 0;
25         for(j = 1;j <= lenb;j++)
26         {
27             cc[i + j - 1] = aa[i] * bb[j] + cc[i + j - 1] + x;
28             x = cc[i + j - 1] / 10;//进位
29             cc[i + j - 1] %= 10;
30         }
31         cc[i+lenb] = x;//最前面的数字的进位
32     }
33     lenc = lena + lenb;
34     while(cc[lenc] == 0 && lenc > 1) lenc--;//清除首位0
35     for(i = lenc;i >= 1;i--)printf("%d",cc[i]);
36     return 037 }

我们知道,当列一个乘法竖式时,使一个乘数的一个数字和另一个乘数的一个数字相乘,将得到的结果放在它相应的“等待相加”的位置。而这个“等待相加”的位置每一行依次往前“挪”,而现在我们把原本“第二行”记录的结果直接加到“第一行”中,再加上后一个数字向前的进位,更新了当前位置的数字值。通过cc[i + j - 1] = aa[i] * bb[j] + cc[i + j - 1] + x;这个式子得以实现。

原文地址:https://www.cnblogs.com/peppa/p/8538328.html