1. 程式人生 > >【LeetCode】Multiply Strings 解題報告

【LeetCode】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.

【解析】

題意:兩個字串表示的非負整數相乘,用字串的形式返回積。

思路:逐位相乘。

關鍵:中間結果如何儲存?如果用字串儲存中間結果,頻繁該值不太方便,所以還是用整數陣列儲存,最後再轉為字串比較方便。

public class Solution {
    public String multiply(String num1, String num2) {
        if (num1.equals("0") || num2.equals("0")) return "0";
        
        int[] table = new int[num1.length() + num2.length()];//存放乘積,低位存低位
        int len = 0; //積的長度,用於轉為字串
        
        for (int i = num1.length() - 1; i >= 0; i--) {
            int digit1 = (int)(num1.charAt(i) - '0');
            int carry = 0;
            int k = num1.length() - 1 - i;  //本輪乘積結果開始的位置
            
            for (int j = num2.length() - 1; j >= 0; j--, k++) {
                int digit2 = (int)(num2.charAt(j) - '0');
                int res = digit1 * digit2;  //位與位的乘積
                res += table[k];            //加上上一輪乘積第k位的數
                res += carry;               //加上進位到第k位的數
                table[k] = res % 10;        //進位後剩餘的數
                carry = res / 10;           //進位
            }
            
            //更新結果的長度
            if (k - 1 > len) {
                len = k - 1;
            }
            
            //如果最後進位不為0
            if (carry > 0) {    
                table[k] += carry;
                if (table[k] > 9) {
                    table[k + 1] = table[k] / 10;
                    table[k] %= 10;
                    k++;
                }
                if (k > len) {  //更新結果的長度
                    len = k;
                }
            }
        }
        
        //把積轉為字串
        String ans = "";
        for (int i = len; i >= 0; i--) {
            ans += String.valueOf(table[i]);
        }
        
        return ans;
    }
}