-
此题考察的是大整数乘法。
- 直接乘会溢出,所以可以设想每次利用两个single digit相乘,这样结果最大才会为81,不会溢出。
- 把两个single digit相乘得到的结果可以保存到一个数组中。比如385 * 97, 数组第0个元素为5 * 7,数组第1个元素为8 * 7 + 5 * 9 ,数组第2个元素3 * 7 + 8 * 9,数组第三个元素为3*9。
- 这个数组最大长度为num1.len + num2.len,比如99 * 99,最大不会超过10000,所以4位就够了。
- 这种个位在后面的,不好做(10的0次方,可惜对应位的数组index不是0而是n-1),
所以干脆先把string reverse了代码就清晰好多。 - 最后结果前面的0要清掉。 举例如图:
首先我们把每一位相乘,得到一个没有进位的临时结果,如图中间的一行红色数字就是临时结果,然后把临时结果从低位起依次进位。对于一个m位整数乘以n位整数的结果,最多只有m+n位。注意:结果中需要去掉先导0,还需要注意结果为0的情况。代码如下:
class Solution { public: string multiply(string num1, string num2) { int n1 = num1.size(), n2 = num2.size(); vector<int> tmpres(n1+n2, 0);//注意vector的使用方法 int k = n1 + n2 - 2; for(int i = 0; i < n1; i++) for(int j = 0; j < n2; j++) tmpres[k-i-j] += (num1[i]-'0')*(num2[j]-'0');//注意tmpres的下标k-i-j int carryBit = 0; for(int i = 0; i < n1+n2; i++)//处理进位 { tmpres[i] += carryBit; carryBit = tmpres[i] / 10; tmpres[i] %= 10; } int i = k+1; while(tmpres[i] == 0)i--;//去掉乘积的前导0 if(i < 0)return "0"; //注意乘积为0的特殊情况 string res; for(; i >= 0; i--) res.push_back(tmpres[i] + '0'); return res; } };
43. Multiply Strings
最新推荐文章于 2024-04-28 07:28:07 发布