1. 程式人生 > >LeetCode-43. Multiply Strings

LeetCode-43. Multiply Strings

temp 兩個 start != div 測試用例 arr http size_t

一、問題描述

 技術分享圖片

  翻譯一下:給定兩個string表示的數num1和num2,以string返回他們的乘積。num1滿足如下條件:

    1、num1和num2的長度都小於110。

    2、num1和num2都只含有0-9。

    3、num1和num2前都不以0開頭。

    4、不能使用string轉int的任何函數

二、問題解決

  思路一:將乘法拆解為加法,先實現兩個string數的加法,再依次遍歷num1,不斷累加得出結果

string stradd(string num1, string num2) {
    string result = "";
    int pos1 = num1.size()-1
; int pos2 = num2.size()-1; int len = min(pos1,pos2) +1; int carry = 0; //用來標誌有沒有進位 //從尾部向前相加,直達有一個數位數用完 while (len > 0) { char c = num1[pos1] + num2[pos2] - 0 + carry; if (c > 9) { c = c - 10 ; carry = 1; }
else carry = 0; result.insert(result.begin(),c); --pos1; --pos2; --len; } //如果兩數位數相同,則看carry,有進位則前面加1,沒有則直接返回 if (num1.size() == num2.size()) { if (carry) result.insert(result.begin(), 1); return result; } //處理剩余部分
string remain = ""; if (num1.size() > num2.size()) remain = num1.substr(0,pos1+1); else remain = num2.substr(0, pos2+1); if (remain == "0" && carry == 0) return result; //然後是remain加上carry位,將remain附加在result之前 if (carry == 1) { int i = remain.size() - 1; for (; i>=0 ; --i) { if (remain[i] == 9) remain[i] = 0; else { ++remain[i]; break; } } if (i < 0) remain.insert(remain.begin(),1); } result = result.insert(0,remain); return result; } string multiply(string num1, string num2) { if (num1 == "0" || num2 == "0") return "0"; string result = ""; string bit = ""; for (int i = num1.size() - 1; i >= 0;--i) { string temp = bit; while (num1[i] != 0) { temp = stradd(temp,num2); --num1[i]; } result = stradd(result,temp.append(bit)); bit.append("0"); } int i = 0; while( i+1< result.size()-1 && result[i] == 0) result = result.substr(i+1,result.size()-i); return result; } //這是測試用例 int main() { string s1 = "9800"; string s2 = "294"; cout << stradd(s1,s2) << endl; cout << stoi(s1) * stoi(s2) << endl; system("pause"); return 0; }

  思路二:自己的解答太繁瑣,大佬的解答。題目只說了不能使用string轉數,但是沒說不能用乘法。

string multiply(string num1, string num2) {
    string sum(num1.size() + num2.size(), 0);
    
    for (int i = num1.size() - 1; 0 <= i; --i) {
        int carry = 0;
        for (int j = num2.size() - 1; 0 <= j; --j) {
            int tmp = (sum[i + j + 1] - 0) + (num1[i] - 0) * (num2[j] - 0) + carry;
            sum[i + j + 1] = tmp % 10 + 0;
            carry = tmp / 10;
        }
        sum[i] += carry;
    }
    
    size_t startpos = sum.find_first_not_of("0");
    if (string::npos != startpos) {
        return sum.substr(startpos);
    }
    return "0";
}

三、問題思考

  1、char轉int的簡便方式,使用char-‘0’可以得到(因為本身char就是一個數,可以參與運算)。

  2、find_first_not_of的使用。

LeetCode-43. Multiply Strings