LeetCode-43. Multiply Strings
阿新 • • 發佈:2018-01-30
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