1.22
阿新 • • 發佈:2021-01-23
題目
給定兩個以字串形式表示的非負整數 num1 和 num2,返回 num1 和 num2 的乘積,它們的乘積也表示為字串形式。
思路
思路1:兩數做乘法,第二個數的每一位乘以第一個數,然後將每一個結果相加。
思路2:通過兩數相乘時,乘數某位與被乘數某位相乘,與產生結果的位置的規律來完成。具體規律如下:
乘數 num1 位數為 MM,被乘數 num2 位數為 NN, num1 x num2 結果 res 最大總位數為 M+N
num1[i] x num2[j] 的結果為 tmp(位數為兩位,“0x”,"xy"的形式),其第一位位於 res[i+j],第二位位於 res[i+j+1]。
程式碼實現(思路1)
class Solution
{
public:
string mul(string num1, char a) //相乘
{
string result = "";
int len = num1.size();
int carry = 0;
for (int i = len - 1; i >= 0; i--)
{
int sum = (num1[i] - '0') * (a - '0');
int count = (sum + carry) % 10;
carry = (sum + carry) / 10;
result += (count + '0');
}
if (carry) //最後的進位不能忘,不然有可能會漏掉最前面的1
result += (carry + '0');
reverse(result.begin(), result.end());
return result;
}
string add(string num1, string num2) //相加
{
string result = "";
int len1 = num1.size();
int len2 = num2.size();
int i = len1 - 1;
int j = len2 - 1;
int carry = 0;
while (i >= 0 && j >= 0) {
int sum = (num1[i] - '0') + (num2[j] - '0');
int count = (sum + carry) % 10;
carry = (sum + carry) / 10;
result += (count + '0');
i--;
j--;
}
while (i >= 0)
{
int sum = num1[i] - '0';
int count = (sum + carry) % 10;
result += (count + '0');
carry = (sum + carry) / 10;
i--;
}
while (j >= 0)
{
int sum = num2[j] - '0';
int count = (sum + carry) % 10;
result += (count + '0');
carry = (sum + carry) / 10;
j--;
}
if (carry)
result += (carry + '0');
reverse(result.begin(), result.end());
return result;
}
string multiply(string num1, string num2)
{
if (num1 == "0" || num2 == "0")
return "0";
int len2 = num2.size();
string result = "";
for (int i = 0; i < len2; i++) {
string cur = mul(num1, num2[i]);
result = add(result + '0', cur);
}
return result;
}
};
程式碼實現(思路2)
class Solution {
public:
string multiply(string num1, string num2) {
if (num1 == "0" || num2 == "0") {
return "0";
}
int m = num1.size(), n = num2.size();
auto ansArr = vector<int>(m + n);
for (int i = m - 1; i >= 0; i--) {
int x = num1.at(i) - '0';
for (int j = n - 1; j >= 0; j--) {
int y = num2.at(j) - '0';
ansArr[i + j + 1] += x * y;
}
}
for (int i = m + n - 1; i > 0; i--) {
ansArr[i - 1] += ansArr[i] / 10;
ansArr[i] %= 10;
}
int index = ansArr[0] == 0 ? 1 : 0;
string ans;
while (index < m + n) {
ans.push_back(ansArr[index]);
index++;
}
for (auto &c: ans) {
c += '0';
}
return ans;
}
};
總結
就我個人而言,只想到了第一種解法,雖然程式碼比較長看起來複雜,但是容易理解。
第二種思路是看題解懂得演算法(和程式碼)後寫的。