题目描述
有两个用字符串表示的非常大的大整数,算出他们的乘积,也是用字符串表示。不能用系统自带的大整数类型。
输入描述
空格分隔的两个字符串,代表输入的两个大整数
输出描述
输入的乘积,用字符串表示
示例1
输入:72106547548473106236 982161082972751393
输出:70820244829634538040848656466105986748
算法分析
1. 将每位之间相乘的结果累加到数组中(m位整数和n位整数的乘积不超过m+n位);
2. 对数组中每一位计算进位及余数,转为结果字符串;
3. 去除字符串首位的0。
提交代码:
#include<iostream>
#include<string>
#include<algorithm>
#include<vector>
#include <bitset>
using namespace std;
int main()
{
string s1, s2, ans;
cin >> s1 >> s2;
reverse(s1.begin(), s1.end());
reverse(s2.begin(), s2.end());
vector<int> arr(s1.size()+s2.size(), 0);
// 1.相乘结果存在数组中
for (int i = 0; i < s1.size(); ++i) {
int num1 = s1[i] - '0';
for (int j = 0; j < s2.size(); ++j) {
int num2 = s2[j] - '0';
arr[i+j] += num1*num2;
}
}
// 2.将数组中结果转为字符串
for (int i = 0; i < arr.size(); ++i) {
int digit = arr[i] % 10;
int carry = arr[i] / 10;
ans.insert(0, to_string(digit));
if (i < arr.size() - 1)
arr[i+1] += carry;
}
// 3.去除首部的0
while (ans[0] == '0' && ans.size() > 0)
ans.erase(0);
cout << ans << endl;
return 0;
}