題目:給定兩個字符串s1和s2,返回它們代表的正整數的乘積(也用字符串表示),不能把字符串轉成整數類型再操作。
解法:手動模擬乘法。假設第一個字符串有n1位,第二個有n2位,則乘積位數不會超過(n1+n2)位,因此可以先將結果字符串res設置為(n1+n2)個0。對s2的每一位,和s1的每一位依次做乘法再相加。乘積模10就是需要放在那一位的數字。在生成res時,需要和當前res該位的數字進行加法運算(如一開始時就是0),因此進位是當前乘積整除10加上這個加法運算的和整除10。在對s2的每一位操作結束后,最后一個進位還沒有加上去,因此需要手動把進位加到前面一位去。循環下去可以得到乘積。
class Solution { public: string multiply(string num1, string num2) { int l1 = num1.length(); int l2 = num2.length(); if (num1 == "0" || num2 == "0") return "0"; string res(l1 + l2, '0'); for (int i = l1 - 1; i >= 0; i--) { int step = 0; for (int j = l2 - 1; j >= 0; j--) { int mul = (num1[i] - '0') * (num2[j] - '0'); int sum = res[i+j+1] - '0' + step + mul % 10; res[i+j+1] = sum % 10 + '0'; step = sum / 10 + mul / 10; } res[i] += step; } for (int i = 0; i < l1 + l2; i++) { if (res[i] != '0') return res.substr(i); } return "0"; } };