LeetCode 43. 字符串相乘(Multiply Strings) 大數乘法


 

題目描述

 

給定兩個以字符串形式表示的非負整數 num1 和 num2,返回 num1 和 num2 的乘積,它們的乘積也表示為字符串形式。

 

示例 1:

輸入: num1 = "2", num2 = "3"
輸出: "6"

示例 2:

輸入: num1 = "123", num2 = "456"
輸出: "56088"

 

說明:

  1. num1 和 num2 的長度小於110。
  2. num1 和 num2 只包含數字 0-9
  3. num1 和 num2 均不以零開頭,除非是數字 0 本身。
  4. 不能使用任何標准庫的大數類型(比如 BigInteger)直接將輸入轉換為整數來處理

 

解題思路

 

根據數字乘法的計算規則,從一個數個位開始依次求出與另一個數的乘積並逐位相加。下面以“98”和“99”的乘法計算來說明算法思想。

  1. 首先考慮乘積的總位數,兩個數相乘的最大位數為兩數的位數之和,所以先申請一個結果字符串位數為4,並且每一位都初始化為‘0’
  2. 從第一個數的個位數‘8’開始,依次與“99”相乘。在乘法過程中首先初始化每一位置的進位add為0,然后計算出對應單個位的乘積mul,比如第一位8x9=72,然后取其個位與當前位置的數字以及前一位置的進位add相加得到sum,此時sum為2+0+0=2,所以結果字符串的個位數字就為‘2’。當前位置的進位add更新為mul的十位數與sum十位數之和,此時進位add為7+0=7.
  3. 計算完一次單個位置的乘法后,最后將當前乘積的前一位更新為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 };

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM