题目:
给定两个以字符串形式表示的非负整数 num1 和 num2,返回 num1 和 num2 的乘积,它们的乘积也表示为字符串形式。
示例 1:
输入: num1 = “2”, num2 = “3”
输出: “6”
示例 2:
输入: num1 = “123”, num2 = “456”
输出: “56088”
说明:
num1 和 num2 的长度小于110。
num1 和 num2 只包含数字 0-9。
num1 和 num2 均不以零开头,除非是数字 0 本身。
不能使用任何标准库的大数类型(比如 BigInteger)或直接将输入转换为整数来处理。
直接使用竖式填充的方法求解
代码如下所示:
#include <iostream>
#include <vector>
#include <algorithm>
using namespace std;
class Solution {
public:
string multiply(string num1, string num2) {
if (num1 == "0" || num2 == "0") return "0";
string retStr = "";
// 大小判断
string str1 = num1.size() >= num2.size() ? num1 : num2;
string str2 = str1 == num1 ? num2 : num1;
// 存放需要计算的部分
vector<vector<int>> vecArr;
int cf = 0;
for (int i = str2.size() - 1; i >= 0; i--) // 4 5 6
{
cf = 0; // 进位
int num = str2[i] - 48;
vector<int> tmpArr;
for (int j = str1.size() - 1; j >= 0; j--) // 1 2 3
{
int numStr1 = str1[j] - 48;
tmpArr.push_back((num * numStr1 + cf) % 10);
cf = (num * numStr1 + cf) / 10;
}
if (cf != 0)
tmpArr.push_back(cf);
reverse(tmpArr.begin(), tmpArr.end());
vecArr.push_back(tmpArr);
}
if (vecArr.size() >= 2) {
int index = 0;
for (int i = 1; i < vecArr.size(); i++)
{
for (int j = 0; j <= index; j++)
vecArr[i].push_back(0);
++index;
}
int maxS = vecArr[vecArr.size() - 1].size();
for (int i = 0; i < vecArr.size(); i++)
{
while (vecArr[i].size() != maxS) {
vecArr[i].insert(vecArr[i].begin(), 0);
}
}
}
cf = 0;
for (int i = vecArr[0].size() - 1; i >= 0; i--)
{
int sum = vecArr[0][i];
for (int j = 1; j < vecArr.size(); j++)
sum += vecArr[j][i];
retStr += ((sum + cf) % 10 + 48);
cf = (sum + cf) / 10;
}
while (cf) { retStr.push_back(char(cf % 10 + 48)); cf /= 10; }
reverse(retStr.begin(), retStr.end());
return retStr;
}
};
int main() {
cout << (new Solution())->multiply("1234567891321", "64846312313516664");
return 0;
}
代码比较长,但是比较好理解 . . .