版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
题目:有两个用字符串表示的非常大的大整数,算出他们的乘积,也是用字符串表示。
思路:
假设有两个数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;
}