43. Multiply Strings - cocoder39/coco39_LC GitHub Wiki
- length of final result
- eg. 999 * 99 < 1000 * 100 = 100,000
- m-digit * n-digit < 10^m * 10^n = 10^(m+n) ==>>
- m-digit * n-digit <= 10^(m+n) - 1 = (m+n)-digit
- attention to leading 0
- attention to empty string after removing leading 0, which should be mapped to 0
- once reverse num1, num2, res[i+j] += int(num1[i]) * int(num2[j])
class Solution:
def multiply(self, num1: str, num2: str) -> str:
m, n = len(num1), len(num2)
res = [0] * (m+n)
num1, num2 = num1[::-1], num2[::-1]
for i in range(m):
for j in range(n):
res[i+j] += int(num1[i]) * int(num2[j])
res[i+j+1] += res[i+j] // 10
res[i+j] %= 10
res.reverse()
start = 0
while start < len(res) and res[start] == 0:
start += 1
if start == len(res):
return '0'
return ''.join([str(digit) for digit in res[start:]])
m-digit number * n-digit number = (m+n)-digit number
eg. 999 * 99 < 1000 * 100 = 100,000
m-digit * n-digit < 10^m * 10^n = 10^(m+n) ==>>
m-digit * n-digit <= 10^(m+n) - 1 = (m+n)-digit
corner case: leading '0'
string multiply(string num1, string num2) {
reverse(num1.begin(), num1.end());
reverse(num2.begin(), num2.end());
int m = num1.length(), n = num2.length();
string res(m + n, '0');
for (int i = 0; i < m; i++) {
int carry = 0;
for (int j = 0; j < n; j++) {
int sum = res[i + j] - '0' + (num1[i] - '0') * (num2[j] - '0') + carry;
res[i + j] = sum % 10 + '0';
carry = sum / 10;
}
res[i + n] = carry + '0';
}
while (res.size() > 1 && res.back() == '0') res.pop_back();
reverse(res.begin(), res.end());
return res;
}