題目描述
給定兩個以字符串形式表示的非負整數 num1
和 num2
,返回 num1
和 num2
的乘積,它們的乘積也表示為字符串形式。
示例 1:
輸入: num1 = "2", num2 = "3" 輸出: "6"
示例 2:
輸入: num1 = "123", num2 = "456" 輸出: "56088"
說明:
num1
和num2
的長度小於110。num1
和num2
只包含數字0-9
。num1
和num2
均不以零開頭,除非是數字 0 本身。- 不能使用任何標准庫的大數類型(比如 BigInteger)或直接將輸入轉換為整數來處理。
解題思路
根據數字乘法的計算規則,從一個數個位開始依次求出與另一個數的乘積並逐位相加。下面以“98”和“99”的乘法計算來說明算法思想。
- 首先考慮乘積的總位數,兩個數相乘的最大位數為兩數的位數之和,所以先申請一個結果字符串位數為4,並且每一位都初始化為‘0’
- 從第一個數的個位數‘8’開始,依次與“99”相乘。在乘法過程中首先初始化每一位置的進位add為0,然后計算出對應單個位的乘積mul,比如第一位8x9=72,然后取其個位與當前位置的數字以及前一位置的進位add相加得到sum,此時sum為2+0+0=2,所以結果字符串的個位數字就為‘2’。當前位置的進位add更新為mul的十位數與sum十位數之和,此時進位add為7+0=7.
- 計算完一次單個位置的乘法后,最后將當前乘積的前一位更新為add,具體來說8x99=792,但遍歷完99后結果只記錄了最后兩位“92”,此時進位add為7,所以要將前一位更新為7
計算完結果后要判斷輸出的總位數,因為可能出現結果字符串前幾位都是0的情況,找到第一位不是0的數字然后返回之后的字符串。
代碼
1 class Solution { 2 public: 3 string multiply(string num1, string num2) { 4 int l1=num1.size(),l2=num2.size(); 5 string res(l1+l2,'0'); 6 if(l1==0||l2==0) 7 return ""; 8 for(int i=l1-1;i>=0;i--){ 9 int add=0; 10 for(int j=l2-1;j>=0;j--){ 11 int mul=(num1[i]-'0')*(num2[j]-'0'); 12 int sum=res[i+j+1]+add+mul%10-'0'; 13 res[i+j+1]='0'+sum%10; 14 add=mul/10+sum/10; 15 } 16 res[i]+=add; 17 } 18 for(int i=0;i<l1+l2;i++) 19 if(res[i]!='0') 20 return res.substr(i); 21 return "0"; 22 } 23 };