字符串相乘
题目链接
https://leetcode-cn.com/problems/multiply-strings/
思路
借鉴
https://leetcode-cn.com/problems/multiply-strings/solution/si-lu-qing-xi-by-lllllliuji-2/
-
把两个数用数组 a, b 来存储,并且反转(从个位开始乘)
-
对于 a 的第 i 位 和 b 的第 j 位相乘的结果存储在 c[i + j] 上,即 c[i + j] += a[i] * b[j];
这里用加号是因为有多种情况都会映射到 i + j 位上。 -
最后,从 c 的低位向高位整理,c[i + 1] = c[i] / 10, c[i] %= 10;
一个整理样例:1 2 3 乘 4 5 6 ———————————————————— 6 12 18 5 10 15 4 8 12 ———————————————————— 4 13 28 27 18 整理: c[i + 1] += c[i] / 10, c[i] %= 10, 从低位开始。 step 0: 4 13 28 27 18 step 1: 4 13 28 28 8 step 2: 4 13 30 8 8 step 3: 4 16 0 8 8 step 4: 5 6 0 8 8
Python实现
class Solution:
def multiply(self, num1: str, num2: str) -> str:
a = list(num1)
b = list(num2)
asize = len(a)-1
bsize = len(b)-1
ans = ''
c = list([0]*(asize+bsize+1))
if num1 == "0" or num2 =="0":
ans = "0"
return ans
else:
for i in range(bsize,-1,-1):
for j in range(asize,-1,-1):
c[i+j] += int(a[j])*int(b[i])
for i in range(len(c)-1,0,-1):
c[i-1] += int(c[i]/10)
c[i] = c[i]%10
print(c)
for i in range(len(c)):
ans +=str(c[i])
return ans
C++实现
class Solution {
public:
string multiply(string num1, string num2) {
string ans;
vector<int> a, b, c;
c.resize(num1.size() + num2.size() - 1);
for (int i = num1.size() - 1; i >= 0; i--) a.push_back(num1[i] - '0');
for (int i = num2.size() - 1; i >= 0; i--) b.push_back(num2[i] - '0');
for (int i = 0; i < a.size(); i++) {
for (int j = 0; j < b.size(); j++) {
c[i + j] += a[i] * b[j];
}
}
int k = 0;
for (int i = 0; i < c.size(); i++) {
k += c[i];
char c = k % 10 + '0';
ans = c + ans;
k /= 10;
}
while (k) {
char c = k % 10 + '0';
ans = c + ans;
k /= 10;
}
while (ans.size() > 1 && ans[0] == '0') ans.erase(ans.begin());
return ans;
}
};
作者:lllllliuji-2
链接:https://leetcode-cn.com/problems/multiply-strings/solution/si-lu-qing-xi-by-lllllliuji-2/
来源:力扣(LeetCode)
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。