Given two non-negative integers num1
and num2
represented as strings, return the product of num1
and num2
, also represented as a string.
Example 1:
Input: num1 = "2", num2 = "3"
Output: "6"
Example 2:
Input: num1 = "123", num2 = "456"
Output: "56088"
Note:
- The length of both
num1
andnum2
is < 110. - Both
num1
andnum2
contain only digits0-9
. - Both
num1
andnum2
do not contain any leading zero, except the number 0 itself. - You must not use any built-in BigInteger library or convert the inputs to integer directly.
解题思路
本题为乘法模拟,以num1 = 123,num2 = 456为例,我们在演算的时候先用6 * 123 得到738,在用5 * 123 得到615,再用4 * 123得到492,最后这三个数错位相加。
首先用一个num二维数组记录num1分别乘以1-10得到的结果
再设一个num1.length() + num2.length()的res数组,初始每位均为0(两数相乘最后的得到的结果的长度最多为两数长度之和)
再从num2的末尾向前遍历,取对应数字的num数组,再与res数组进行错位相加,错的位数为当前为与num2的最后一位的距离。
题解
class Solution {
public:
string multiply(string num1, string num2) {
vector<int>num[10];
for(int i = 0; i < 10; ++ i){
int c = 0, temp;
for(int j = num1.length() - 1; j >= 0; -- j){
temp = (num1[j] - '0') * i + c;
num[i].push_back(temp % 10);
c = temp / 10;
}
if(c > 0)
num[i].push_back(c);
}
vector<int>res(num1.length() + num2.length(), 0);
reverse(num2.begin(), num2.end());
for(int i = 0; i < num2.length(); ++ i){
int temp = num2[i] - '0', c = 0, tempsum;
for(int j = 0; j < num[temp].size(); ++ j){
tempsum = res[i+j] + num[temp][j] + c;
res[i+j] = tempsum % 10;
c = tempsum / 10;
}
int x = i + num[temp].size();
while(c > 0){
tempsum = res[x] + c;
res[x] = tempsum % 10;
c = tempsum / 10;
x += 1;
}
}
int i = res.size() - 1;
while(i > 0 && res[i] == 0)
-- i;
string s = "";
while(i >= 0)
s +=(res[i--]+'0');
return s;
}
};