一、算法背景

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;
}

Logo

腾讯云面向开发者汇聚海量精品云计算使用和开发经验,营造开放的云计算技术生态圈。

更多推荐