题目描述
以字符串形式给定两个非负整数,以字符串的形式返回两个整数的乘积。
给定字符串的长度小于110。
样例
Input: num1 = “2”, num2 = “3”
Output: “6”
Input: num1 = “123”, num2 = “456”
Output: “56088”
思路
模拟当时学乘法的手算,用竖式的方法来求解
乘积的最大长度为两个乘数的长度之和。
代码
class Solution {
public:
string multiply(string num1, string num2) {
int n = num1.size(),m=num2.size();
vector<int> a(n),b(m),c(m+n);
for(int i=0;i<n;i++){
a[n-i-1]=num1[i]-'0';//将两个字符串逆转并换为数字每位放于一个数组中
}
for(int i=0;i<m;i++){
b[m-i-1]=num2[i]-'0';
}
for(int i=0;i<n;i++){//模拟竖式,这是代码的核心
for(int j=0;j<m;j++){
c[i+j]+=a[i]*b[j];//当前位相乘并加上原来的位
c[i+j+1]+=c[i+j]/10;//取当前位置的进位添加到更高位
c[i+j]%=10;//取模位当前位
}
}
int l=m+n;//新数组总长度
while(l>1&&c[l-1]==0) l--;//删去前面的0元素
string res ="";
for(int i=l-1;i>=0;i--){//将翻转的成绩从后往前添加进去
res+=(c[i]+'0');
}
return res;
}
};