题目链接:43.字符串相乘
题解:
高精度乘以高精度!
题目简述:
两个字符串高精度相乘返回结果的字符串!
题解:
模拟小学乘法即可!
两个数相乘,最后积的位数为两数长度之和或者为长度之和减 1 !
思路:
- 先将字符串映射成数字,再倒序存到数组,为了方便计算!
- 两层循环,让第二个数的每一位去乘第一个数,存到新数组
c[i + j],这样可以保证该放到同一列的都在同一列
- 然后将需要进位的给了下一位,即
c[i + j + 1] += c[i + j] / 10
- 再将本位的余数留下即可,即
c[i + j] %= 10
- 最后需要将末尾的零去掉,即反转为正常数字的前导0.(例如乘以0,或者位数为两数之和减 1)
- 在将其映射为字符串,倒序存储到新数组,返回!
算了,懒得画图了,太好理解了!
时间复杂度: O(n * m)
AC代码:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21
| class Solution { public: string multiply(string num1, string num2) { int n = num1.size(), m = num2.size(); vector<int> a(n), b(m), c(n + m); for(int i = 0; i < n; i++) a[n - i - 1] = num1[i] - '0'; for(int i = 0; i < m; i++) b[m - i - 1] = num2[i] - '0'; for(int i = 0; i < n; i++){ for(int j = 0; j < m; j++){ c[i + j] += a[i] * b[j]; c[i + j + 1] += c[i + j] / 10; c[i + j] %= 10; } } int len = n + m; while(len > 1 && c[len - 1] == 0) len--; string res = ""; for(int i = len - 1; i >= 0; i--) res += c[i] + '0'; return res; } };
|