给定两个以字符串形式表示的非负整数 num1 和 num2,返回 num1 和 num2 的乘积,它们的乘积也表示为字符串形式。
示例 1:
输入: num1 = "2", num2 = "3"
输出: "6"
示例 2:
输入: num1 = "123", num2 = "456"
输出: "56088"
说明:
- num1 和 num2 的长度小于110。
- num1 和 num2 只包含数字 0-9。
- num1 和 num2 均不以零开头,除非是数字 0 本身。
- 不能使用任何标准库的大数类型(比如 BigInteger)或直接将输入转换为整数来处理。
这个题就是乘法的基础计算,将每一位数拆解出来进行相乘,然后错位相加,存储到新的数组中,然后新的数组中就是新的每一位的数,如果大于9就是产生进位,进位加到后面的高位数即可。这个题最好写一个乘法的竖式能好理解一点。程序中是从前往后乘的,所以新数组中存数位从后往前存。这样最终产生的数组就是低位在前,高位在后,最终转化位字符串就是从后往前加到字符串中。
C++源代码:
class Solution {
public:
string multiply(string num1, string num2) {
int m = num1.size(), n = num2.size();
int k = m + n - 2;
int c = 0;
vector<int> temp(m+n, 0);
string res;
for(int i=0;i<m;i++)
for(int j=0;j<n;j++)
temp[k-i-j] += (num1[i]-'0') * (num2[j]-'0');
for(int i=0;i<m+n;i++)
{
temp[i] += c;
c = temp[i] / 10;
temp[i] = temp[i] % 10;
}
int f = m+n-1;
while(f>=0 && temp[f]==0) f--;
if(f<0) return "0";
while(f>=0) res.push_back(temp[f--]+'0');
return res;
}
};
python3源代码:
class Solution:
def multiply(self, num1, num2):
"""
:type num1: str
:type num2: str
:rtype: str
"""
m = len(num1)
n = len(num2)
k = m+n-2
c = 0
temp = [0 for i in range(m+n)]
res = ""
for i in range(m):
for j in range(n):
temp[k-i-j] += int(num1[i]) * int(num2[j])
for i in range(m+n):
temp[i] += c
c = temp[i] // 10
temp[i] = temp[i] % 10
f = m+n-1
while f>=0 and temp[f]==0: f-=1
if f < 0: return "0"
while f >= 0:
res += str(temp[f])
f -= 1
return res