1. 程式人生 > >[leetcode]43. Multiply Strings

[leetcode]43. Multiply Strings

一開始以為是分治遞迴的那種大整數相乘,還發現了一個牛逼演算法,但是這個演算法還是不能超過long,因為其中有一個longlong想加要處理,和題意不符合。

大整數相乘的牛逼方法
https://blog.csdn.net/u010983881/article/details/77503519


Solution1:根據兩數相乘的原理,用一個int【】儲存先都不進位的結果。然後res陣列從右往左進位。一個很tricky的點是,res陣列的第0位正好可以留給最高位進位。

class Solution {
    public String multiply(String num1, String num2) {
        if(num1==""||num2=="")return "0";
       
        char[] char1=num1.toCharArray();
        char[] char2=num2.toCharArray();
        
        int[] arr1 = new int[char1.length];
        int[] arr2 = new int[char2.length];
        for(int i = 0; i < char1.length; i++){
            arr1[i] = char1[i] - '0';
        }
        for(int i = 0; i < char2.length; i++){
            arr2[i] = char2[i] - '0';
        }
        
        int[] ans=add(arr1,arr2);
        String resStr="";
        
        //處理有數為0的情況
        int isAllZero=0;
        for(int i=0;i<ans.length;i++){
            if(ans[i]!=0)isAllZero=1;
            resStr+=String.valueOf(ans[i]);
        }
        
        if(isAllZero==1){
        //最高位如果沒有進位,那麼res【0】預設是0,就不要輸出了。
            if(ans[0]==0)return resStr.substring(1);
            else return resStr;
        }
        
        else{
            return "0";
        }
        
        

    }
    public int[] add(int[] nums1,int[] nums2){
        
        int[] res=new int[nums1.length+nums2.length];
        
        for(int i=0;i<nums1.length;i++){
            for(int j=0;j<nums2.length;j++){
                res[i+j+1]+=nums1[i]*nums2[j];
            }
        }
        
        for(int k=res.length-1;k>0;k--){
            if(res[k]>=10){
                res[k-1]+=res[k]/10;
                res[k]%=10;
            }
        }
        
        return res;
    }
}