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

LeetCode --- 43. Multiply Strings

Given two numbers represented as strings, return multiplication of the numbers as a string.

Note: The numbers can be arbitrarily large and are non-negative.

這道題的要求是計算大數乘法。其中大數是以字串的形式表示,任意大,非負,返回結果以字串形式。

這道題其實就是模擬整數乘法。

假設兩個整數的長度分別為了l1和l2,則其最後結果長度為l1+l2(最後有進位)或者l1+l2-1(最後沒有有進位)。

因此,可以先用長度為l1+l2的陣列記錄結果,最後再轉成字串。

進行乘法的時候,先把各個位的相乘結果對應累加起來,即第1個整數的第i位(低位到高位)和第2個整數的第j位(低位到高位)相乘的結果應該存放在陣列的i+j位。然後再統一處理進位。

然後再統一處理進位。

最後再將陣列轉成字串前,需要跳過前面的零。如果結果只有0,則只返回0。

時間複雜度:O(l1l2)(l1和l2分別為兩個整數長度)

空間複雜度:O(l1+l2)

 1 class Solution
 2 {
 3 public:
 4     string multiply(string num1, string num2)
 5     {
 6         vector<int>
vi(num1.size() + num2.size(), 0); 7 for(int i = 0; i < num1.size(); ++ i) 8 for(int j = 0; j < num2.size(); ++ j) 9 vi[i + j] += (num1[num1.size() - i - 1] - '0') * (num2[num2.size() - j- 1] - '0'); 10 11 for(int i = 0, c = 0; i < vi.size(); ++ i) 12
{ 13 int num = vi[i] + c; 14 vi[i] = num % 10; 15 c = num / 10; 16 } 17 18 string s = ""; 19 int i = vi.size(); 20 while(-- i >= 0 && vi[i] == 0); 21 if(i < 0) 22 s = "0"; 23 else 24 for( ; i >= 0; -- i) 25 s += vi[i] + '0'; 26 27 return s; 28 } 29 };