leetcode-question43

題目描述

給定兩個以字符串形式表示的非負整數 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)或直接將輸入轉換爲整數來處理。

思路

先將字符串轉換爲字符數組,然後將字符數組轉爲int[],然後用其中一個乘數的每一位去乘以另一個乘數的,然後錯位相加,注意進位。特別需要注意的是兩個輸入的字符串有一個全爲0的情況,這個時候計算的結果爲0,但是本題的結果需要做個調整,兩個乘數位數少的那個乘數的位數爲n,如果結果爲0,返回的結果應該爲n個0的字符串。

代碼

class Solution {
    public String multiply(String num1, String num2) {
        char[] num2char1 = num1.toCharArray();
        char[] num2char2 = num2.toCharArray();
        //兩數相乘結果的長度最多也不會超過兩數的長度之和
        int resultLen = num2char1.length + num2char2.length;
        //用於存儲過程結果
        int[] result2Array = new int[resultLen];
        //轉換爲數字
        for(int i = 0; i < num2char1.length;++ i){
            num2char1[i] -= '0';
        }
        for(int i = 0; i < num2char2.length;++ i){
            num2char2[i] -= '0';
        }

        for(int i = num2char2.length - 1; i >= 0 ;--i){
            int carry = 0;
            for(int j = num2char1.length-1;j >=0; --j){
               int temp = num2char2[i] * num2char1[j];
               result2Array[i + j + 1] = result2Array[i + j + 1] + temp + carry;
               carry = result2Array[i + j + 1] / 10;
               result2Array[i + j + 1] %= 10;
            }
            int k = i ;
            while(carry > 0){
                result2Array[k] += carry;
                carry = result2Array[k] / 10;
                result2Array[k] %= 10;
                k --;
            }
        }

        StringBuilder sb = new StringBuilder();

        int cal = 0;
        for(cal = 0; cal < result2Array.length; ++cal){
            if(result2Array[cal] != 0)
                break;
        }

        for(int i = cal; i <  result2Array.length; ++i){
            sb.append(result2Array[i]);
        }
        if(cal == result2Array.length){
            int figures = num1.length() > num2.length() ? num2.length() : num1.length();
            for(int i = 0 ; i < figures; ++i){
                sb.append(0);
            }
        }
        return sb.toString();
    }
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章