解题思路:
1. 根据提示字符串的长度最大为 200,根本无法转化为整形,超出范围。
2. 假设,num1
的长度为 m
,num2
的长度为 n
,那么它们乘积的长度一定不超过 m + n
。比如 9 * 9 = 81
,它绝不会到达三位数。所以,我们可以创建一个整形数组 sum 来保存结果,其长度为 m + n
。
3.我们对于num1 和 num2 的每一位相乘的结果保存起来,对应位置的值相加 ,最后再处理进位获得最终的结果。 具体实现看代码。
class Solution {
public:
string multiply(string num1, string num2)
{
if(num1[0] == '0' || num2[0] == '0')
return string("0");
int size1 = num1.size();
int size2 = num2.size();
vector<int> Num1(size1 , 0); //存储num1的每一位
vector<int> Num2(size2 , 0); //存储num2的每一位
vector<int> sum(size1+size2, 0);
for(int i = 0 ; i < size1 ;++i) //将字符串的每一位转化为 int
{
Num1[i] = num1[i] - '0';
}
for(int i = 0 ; i < size2 ;++i)
{
Num2[i] = num2[i] - '0';
}
for(int i = 0 ; i < size1 ;++i) //根据规律把对应位置相乘的结果相加
{
for(int j = 0 ; j < size2 ;++j)
{
sum[i+j+1] += Num1[i] * Num2[j];
}
}
int carry = 0; //进位
for(int i = size1+size2 - 1 ;i > 0 ; --i) //处理进位获得最终字符串
{
sum[i] += carry;
carry = sum[i] / 10;
sum[i] %= 10;
}
sum[0] = carry;
//如果第一位为 0 ,略过
int begin = 0;
if(carry == 0 )
{
begin = 1;
}
string ret; //将vector<int> 里面的值转化为字符 ,最终串起来
for(int i = begin ;i < size1 + size2 ;++i)
{
ret += ( '0' + sum[i] );
}
return ret;
}
};