C++大数乘法代码实现

问题分析

        易得m位数乘以n位数最终的结果不会超过m+n位,所以申请res数组的空间大小为m+n。

        将每一位数字倒序存储在数组中,易知对于res[]数组中的第n位,在不考虑进位的情况下,他的结果来源是    \sum_{i = 0}^{n}(num1[i] * num2[n - i])    ,所以有res[i + j] = num1[ i ]*num2[ j ] +res[i + j]。注意:此时计算的结果数组也是倒序存放的。计算结果数组的每一位所存储的数组,最后统一处理进位。 

代码实现

string big_muti1(const string &num1,const string &num2) {
	int len1 = num1.size();
	int len2 = num2.size();
	int str_len = len1 + len2;
	int* tmp1 = new int[len1];
	int* tmp2 = new int[len2];
	int* res = new int[str_len];
	//初始化数组
	for (int i = 0; i < len1; i++)
	{
		tmp1[i] = num1[len1 - i - 1] - '0';
	}
	for (int i = 0; i < len2; i++)
	{
		tmp2[i] = num2[len2 - i - 1] - '0';
	}
	for (int i = 0; i < str_len; i++)
	{
		res[i] = 0;
	}
	
	//处理进位
	for (int i = 0; i < len1; i++)
	{
		for (int j = 0; j < len2; j++)
		{
			res[i + j] = tmp1[i] * tmp2[j] + res[i + j];
		}
	}
	int flag = 0;
	for (int i = 0; i < str_len; i++)
	{
		res[i] += flag;
		if (res[i] > 9)
		{
			flag = res[i] / 10;
			res[i] -= flag * 10;
		}
		else
		{
			flag = 0;
		}
	}
	
	//字符串转化
	string str_res = "";
	for (int i = 0; i < str_len; i++)
	{
		str_res += res[i] + '0';
	}
	reverse(str_res.begin(), str_res.end());
	delete[] tmp1, tmp2;
	tmp1 = tmp2 = NULL;
	int size = str_res.size();
	//摘除最终结果前方多余的0
	flag = 0;
	while (size > 1)
	{
		if (str_res[flag] > '0')
		{
			break;
		}
		size--;
		flag++;
	}
	return str_res.substr(flag);
}

        在倒序数组转为字符串时,可能会出现前几位都为0的情况,所以需要摘除前几位多余的0。

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值