C++大整数相乘算法

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接: https://blog.csdn.net/weixin_43669941/article/details/100750462

题目:有两个用字符串表示的非常大的大整数,算出他们的乘积,也是用字符串表示。

思路:

假设有两个数num1 = 987, num2 = 364

模拟人工计算过程

1.将num2从最后一位开始,依次与num1相乘,用一个变量保存相乘时得到的进位

例如:4 * 7的结果是28,得到的进位是2,留下8. 再用4与8相乘,得到的结果是32 + 进位 == 32 + 2 == 34,进位是3,留下4.以此类推,4 * 9的结果是36 + 进位 == 36 + 3 == 39,进位是3,留下9. 此时第一遍相乘已经完成,还剩下一个进位3,直接将他放到9的前面就行了(如果没有进位则不需要这一步),所以最终结果是3948.

2.重复第一步,将最终得到的结果相加,即为两个数相乘的结果

6 * 987 = 5922, 3 * 987 = 2961,根据人工计算的过程,最终相乘的结果应该为3948 + 59220 + 296100 = 359268

由于第二步相加的过程与第一步相乘的过程很相似,因此可在相乘的时候,同时完成类似于3948 + 59220这一步,具体代码如下

#include <iostream>
#include <string>

int main() {
	std::string num1;
	std::string num2;

	std::cin >> num1 >> num2;

	size_t size1 = num1.size();
	size_t size2 = num2.size();
	size_t size_s = size1 + size2;

	std::string result(size_s, '0');

	int num = 0;      //当前位的值
	int over_num = 0; //进位
	int res = 0;      //每次相乘后得到的结果

	size_t i = 0;
	size_t j = 0;

	for (i = 0; i < size2; i++) {
		num = num2[size2 - i - 1] - '0';
		for (j = 0; j < size1; j++) {
			res = num * (num1[size1 - j - 1] - '0') + 
				(result[size_s - i - j - 1] - '0') + over_num;

			result[size_s - i - j - 1] = res % 10 + '0';

			over_num = res / 10;
		}

		if (over_num) {
			result[size_s - i - j - 1] = over_num + '0';
		}

		over_num = 0;
	}

	bool flag = false;

	for (size_t i = 0; i < result.size(); i++) {
		if (result[i] != '0' || flag) {
			flag = true;
			std::cout << result[i];
		}
	}

	std::cout << std::endl;
}

猜你喜欢

转载自blog.csdn.net/weixin_43669941/article/details/100750462