高精度乘法(c++版本)
·
一、算法背景
https://blog.csdn.net/ssssjsn/article/details/157620627?spm=1001.2014.3001.5501
(同精度加法)
二、算法原理
1、将两个数字存放在字符串中,然后再逆序放在数组当中。如果是正序存放的话,不好各个位置相对应的乘法操作。
2、算法模拟乘法操作
(1)相对应位相乘, 但是注意不要进位。(如图所示)

(2)在算到最后的时候再进行进位,这样操作会更简单一点。
(3)同时图中标志a[]数组的下标为i , b[]数组的下标为 j,我们会发现c[]数组的下标为 i + j(这个发现很重要,事关核心代码的实现)
3、需要注意的两点是:
(1) 对于len_c大小的确定 len_c = len_a + len_b。 原因是 设a的更高一位数是 10^n, a这一位的最小数是10^(n - 1),a的位数是n , b的更高一位数是 10^m, b这一位的最小数是10^(m - 1),b的位数是 m , 则 a*b一定是大于 10^(n + m - 2),小于 10^(n + m)的 因此位数就为 n + m。(看不懂也可以带具体的数去看)
(2)也要考虑前导零的情况出现(有一个乘数是0),这个时候我们也需要再次确定len_c的大小。
三、代码实现
#include <iostream>
using namespace std;
const int N = 1e6 + 10;
int a[N], b[N], c[N];
int len_a, len_b, len_c;
void mul(int c[], int a[], int b[])
{
//两层循环
for(int i = 0; i < len_a; i++)
{
for(int j = 0; j < len_b; j++)
{
c[i + j] += a[i] * b[j];
}
}
//处理进位问题
for(int i = 0; i < len_c; i++)
{
c[i + 1] += c[i] / 10;
c[i] %= 10;
}
//处理前导零
while(len_c > 1 && c[len_c - 1] == 0) len_c--;
}
int main()
{
string x, y; cin >> x >> y;
//将字符串逆序放到数组当中去
len_a = x.size(); len_b = y.size(); len_c = len_a + len_b; //思考len_c如何得来
for(int i = 0; i < len_a; i++) a[i] = x[len_a - 1 - i] - '0';
for(int i = 0; i < len_b; i++) b[i] = y[len_b - 1 - i] - '0';
//无进位乘法运算
mul(c, a, b);
//输出
for(int i = len_c - 1; i >= 0; i--)
{
cout << c[i];
}
return 0;
}
更多推荐
所有评论(0)