高精度乘法

Posted 我的露娜不会飘

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了高精度乘法相关的知识,希望对你有一定的参考价值。

 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;这个式子得以实现。

 

以上是关于高精度乘法的主要内容,如果未能解决你的问题,请参考以下文章

求助 c语言实现高精度乘法

高精度 加法 减法 乘法 除法 整合

n阶高精度乘法,(求高阶阶乘)

算法AcWing 793. 高精度乘法

洛谷 P1303 A*B Problem(高精度乘法) 题解

高精度乘法和除法