给定两个以字符串形式表示的非负整数 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)或直接将输入转换为整数来处理。
模拟竖式字符串相乘过程,这里要注意实现技巧是先开一个m+n-1大小的数组,然后删除掉前面的0,转为string
class Solution {
public:
string multiply(string num1, string num2) {
int n = num1.size(), m = num2.size();
if((n==1&&num1[0]=='0') || (m==1&&num2[0]=='0')) return "0";
vector<int> temp(n+m,0); // 用一个n+m-1大小的数组存答案, 最后去掉前面的零得到答案
int p;
for(int i=m-1;i>=0;i--){
p = m-1-i; // 当前位的个位
for(int j=n-1;j>=0;j--){
int num = (num1[j]-'0')*(num2[i]-'0')+temp[p];
if(num>=10) temp[p+1]+=num/10;
temp[p] = num%10;
p++; // 跟着移动
}
}
string res="";
int k = m+n-1;
while(k>=0 && temp[k]==0) k--;
for(int i=k;i>=0;i--)
res.push_back(temp[i]+'0');
return res;
}
};