思路:竖式乘法
1.观察普通计算的竖式乘法可知,m*n位的结果最多为m+n位,记结果为res[m+n],则res[i+j+1]=(
∑
p
+
q
=
i
+
j
+
1
\sum_{p+q=i+j+1}
∑p+q=i+j+1res[i]*res[j]+c)%10,c为上一个结果的进位,c=res[i+j]/10,可以通过二重循环实现。
2.而res[m+n-1]也就是最高位的值是看前一位res[m+n-2]是否有进位确定的。
实现:
1.将长度为m的num1和长度为n的num2转化为数组n1和n2,建立长度为m+n的结果数组res。
2.通过二重循环,res[i+j+1]+=n1[i]+n2[j]
3.对res数组进行处理,确保每一位res[i]<10,也就是进位c=(res[i]+c)/10,res[i]=(c0+res[i])%10,c为当前位数向前一位的进位,c0为后一位向当前位数的进位。
4.判断最高位是否有进位,如果有,最高位res[m+n-1]=c
5.将前导0去除
代码:
class Solution {
public:
string multiply(string num1, string num2) {
int len1=num1.length();
int len2=num2.length();
vector<int> res(len1+len2,0);
vector<int> n1(len1);
vector<int> n2(len2);
for(int i=0;i<len1;i++)
{
n1[i]=num1[i]-'0';
}
for(int i=0;i<len2;i++)
{
n2[i]=num2[i]-'0';
}
for(int i=len1-1;i>=0;i--)
{
for(int j=len2-1;j>=0;j--)
{
res[i+j+1]+=n1[i]*n2[j];
}
}
int c=0;
string s0;
for(int i=len1+len2-1;i>0;i--)
{
int last=res[i];
res[i]=(res[i]+c)%10+'0';
c=(last+c)/10;
s0.insert(0,1,res[i]);
}
if(c)
{
res[len1+len2-1]=c;
s0.insert(0,1,c+'0');
}
else
{
for(string::iterator it=s0.begin();it!=s0.end()&&(*it)=='0';)
{
s0.erase(it);
}
if(s0.empty())
{
s0.push_back('0');
}
}
return s0;
}
};
坑点小结:
string的earse,使用迭代器删除元素时,它会自动返回下一个迭代器的位置,因此无需手动+1