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;
}
};