1. 程式人生 > 其它 >1.22

1.22

技術標籤:寒假作業總結c++

題目

給定兩個以字串形式表示的非負整數 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;
    }
};

在這裡插入圖片描述

總結

就我個人而言,只想到了第一種解法,雖然程式碼比較長看起來複雜,但是容易理解。
第二種思路是看題解懂得演算法(和程式碼)後寫的。