题目
![](https://i-blog.csdnimg.cn/direct/081f37896e2f48769434910fb2450d90.png)
思路
这道题我们可以使用竖式乘法,从右往左遍历每个乘数,将其相乘,并且把乘完的数记录在nums数组中,然后再进行进位运算,将同一列的数进行相加,进位。
解题过程
首先求出两个数组的长度,方便以后遍历。
判断若两个数组中有一个是0,则直接返回0。
然后定义last方便存储相乘后的数。
将num1与num2中的每一个数相乘,用nums记录相乘后得到的数。
接着进行进位运算,用flag记录进位的数。
从右往左遍历nums数组中的数。
![](https://i-blog.csdnimg.cn/direct/400328e39ab045deab720aa75759dd34.png)
这个函数是在0的位置插入一个元素,值为后面的,相当于不断地向前插入。
通过不断改变flag的值来实现向前进位。
最后判断,若最后一位仍有进位,则前插一个flag。
返回last字符串。
下面写了一个123*456的例子方便理解。
![](https://i-blog.csdnimg.cn/direct/b97032e3145d4cc5ad723c116fa8792d.jpeg)
代码
cpp
class Solution {
public:
string multiply(string num1, string num2) {
int len1=num1.length();
int len2=num2.length();
if(num1=="0" || num2 =="0")
return "0";
string last="";
vector<int> nums(len1+len2);
//用一个数组记录下来它们相乘得到的值
for(int i=0;i<len1;i++)
{
for(int j=0;j<len2;j++)
{
nums[i+j] += (num1[i]-'0')*(num2[j]-'0');
}
}
//做进位运算
int flag = 0;
for(int i=len1+len2-2;i>=0;i--)
{
last.insert(0, 1, (nums[i]+flag)%10 + '0');
flag = (nums[i]+flag)/10;
}
if(flag!=0)
last.insert(0, 1, flag + '0');
return last;
}
};