题目描述:
给定两个以字符串形式表示的非负整数 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)或直接将输入转换为整数来处理。
以289*785为例
首先我们把每一位相乘,得到一个没有进位的临时结果,如图中中间的一行红色数字就是临时结果,然后把临时结果从低位起依次进位。对于一个m位整数乘以n位整数的结果,最多只有m+n位。
结果中需要去掉前导0,还需要注意结果为0的情况
代码如下:这里你n1=3,n2=3,k=3+3-2=4;
class Solution {
public:
string multiply(string num1, string num2) {
string res;
int n1=num1.size(),n2=num2.size();
int k=n1+n2-2;
vector<int> temp(n1+n2,0);
for(int i=0;i<n1;i++){
for(int j=0;j<n2;j++){
//这里temp计算两个数的相应位的乘积
temp[k-i-j]+=(num1[i]-'0')*(num2[j]-'0');
}
}
int carray=0;
for(int i=0;i<n1+n2;i++){
temp[i]+=carray;
carray=temp[i]/10;
temp[i]%=10;
}
int i=n1+n2-1;
while(temp[i]==0)i--;//结果中需要去掉前导0
if(i<0)return "0";//还需要注意结果为0的情况
while(i>=0){
res.push_back(temp[i--]+'0');
}
return res;
}
};