[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;
    }
}

猜你喜欢

转载自blog.csdn.net/weixin_36869329/article/details/84829760