按照常规解法,用字符串操作来模拟乘法的步骤可以先实现字符串高精度加法,再将加法运用到乘法过程中。这种方法简单但是耗时比较大,这里介绍一种比较巧妙的方法,借鉴LeetCode上的一份高票代码。
观看下图,它描述的是我们计算乘法的过程。仔细分析可以发现,对于原来在上面字符串中下标为1的“2”和在下面字符串中下标为0的“4”的相乘结果08出现在了最后的乘法结果字符串的下标1和2处。这一结果对其他下标的数字同样成立:下标i和下标j相乘的高位结果位于下标i+j处,低位位于下标i+j+1处。根据这个结果,实现高精度的乘法就变得简单了。
实现代码如下:
class Solution {
public:
string multiply(string num1, string num2) {
int m=num1.size();
int n=num2.size();
vector<int> array(m+n);
string ans="";
for(int i=m-1;i>=0;i--)
for(int j=n-1;j>=0;j--)
{
int index1=i+j;
int index2=i+j+1;
int sum=(num1[i]-'0')*(num2[j]-'0')+array[index2];
array[index1]+=sum/10;
array[index2]=sum%10;
}
for(int p=0;p<array.size();p++)
{
if(p==0){
while(array[p]==0&&p!=array.size()-1)//找到第一个非零位
{
p++;
}
}
ans+=to_string(array[p]);
}
return ans;
}
};