高精度乘法改进版

1.思想:

原想法为:

考虑使用两层for循环,对两个正整数ab的所有元素进行遍历。当内层循环每执行完毕一次,则有数a的所有元素数b的某一元素完成了一次乘法运算,将此结果result_temp存放起来,在外层for循环中进行累加。


这里改进为:

仍使用两层for循环,但是内层循环,只负责保留乘数的结果,外层循环负责对高位乘数的结果左移一位(乘以10).之后统一对结果进行进位处理。

如图:


2.实现:

代码很简洁。核心功能只有20行左右。

#include<iostream>
using namespace std;
#define countof(arr) sizeof(arr)/sizeof(arr[0])

int a_multiply[10000];  // 最大允许位数为10000的乘数
int b_multiply[10000];
int result[20000];  // result值最大位数为 乘数a与乘数b 位数之和
void multiply_func(const string& a, const string& b)
{
	for (int i = a.length()-1; i >=0 ; i--)  // 获取数字
		a_multiply[a.length() - 1-i] = a[i]-'0';
	for (int i = b.length() - 1; i >= 0; i--)
		b_multiply[b.length() - 1 - i] = b[i]-'0';

	for (int i = 0; i < a.length(); i++)
	{
		for (int j = 0; j < b.length(); j++)
		{
			result[i + j] += a_multiply[i] * b_multiply[j];
		}
	}

	for (int i = 0; i < a.length()+b.length(); i++)   // 处理加和进位
	{
		if (result[i] > 9)
		{
			result[i + 1] += result[i] / 10;
			result[i] = result[i] % 10;

		}
	}

	// 输出  遇到第一个不为零的最高位后依次输出,若全为零则输出零
	int index_none_0 = a.length() + b.length();
	while (result[index_none_0] == 0)
	{
		index_none_0--;
	}

	if (index_none_0 < 0)
		cout << 0;
	else
	{
		for (int i = index_none_0; i >= 0; i--)
		{
			cout << result[i];
		}
	}


}

int main()
{
	string a, b;
	cin >> a >> b;
	multiply_func(a, b);

	system("pause");
	return 0;
}

3.输出:

测试输出结果与前述博客高精度乘法一致。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值