题目链接:https://leetcode-cn.com/problems/multiply-strings/
题目描述
给定两个以字符串形式表示的非负整数 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)或直接将输入转换为整数来处理。
模拟列竖式计算过程
(1)拆分为num2每位数字与num1相乘,然后相加
共分为两个子函数函数:
help
:一个数字和一串数字相乘
addStrings
:两个字符串相加
代码
class Solution {
public:
string multiply(string num1, string num2) {
if(num1 == "0" || num2 == "0") return "0";
string s;
for (int i = num2.size() -1; i>=0; --i) {
string zeros(num2.size() -1 - i,'0'); // 补零
string tmp = help(num1, num2[i]) + zeros;
s = addStrings(s, tmp);
}
return s;
}
// 一个数字和一串数字相乘
string help(string num, char c){
if(c == '0') return "0";
string s;
int carry = 0;
for(int i = num.size() -1; i>=0 || carry >0; --i){
int x = i >= 0? num[i] - '0': 0;
int y = c - '0';
s.push_back((x * y + carry) % 10 + '0');
carry = (x * y + carry) / 10;
}
reverse(s.begin(),s.end());
return s;
}
private:
// 两个字符串相加
string addStrings(string num1, string num2){
if(num1.empty())
return num2;
if(num2.empty())
return num1;
string s;
int carry = 0;
for (int i = num1.size() -1, j = num2.size()-1; i>=0 || j>=0 || carry > 0 ; --i, --j) {
int x = i < 0 ? 0 : num1[i] - '0';
int y = j < 0 ? 0 : num2[j] - '0';
s.push_back((x+y+carry)%10 + '0');
carry = (x+y+carry)/10;
}
reverse(s.begin(),s.end());
return s;
}
};