LeetCode43. Multiply Strings(C++)

Given two non-negative integers num1 and num2 represented as strings, return the product of num1and 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:

  1. The length of both num1 and num2 is < 110.
  2. Both num1 and num2 contain only digits 0-9.
  3. Both num1 and num2 do not contain any leading zero, except the number 0 itself.
  4. 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;
    }
};

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章