1. 程式人生 > >大數相乘-LeetCode43-字串相乘

大數相乘-LeetCode43-字串相乘

題目


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

示例 1:

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

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

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

思路1

模擬乘法過程,記錄每個個位值和進位值。按列求和。

程式碼1

class Solution {
    public String multiply(String num1, String num2) {
        //String num1 轉化為 int[]
        int[] num1_array=new int[num1.length()];
        for(int i=0;i<num1.length();i++){
            num1_array[i]=Integer.parseInt(num1.substring(num1.length()-1-i,num1.length()-1-i+1));
        }
        //String num2 轉化為 int[]
        int[] num2_array=new int[num2.length()];
        for(int i=0;i<num2.length();i++){
            num2_array[i]=Integer.parseInt(num2.substring(num2.length()-1-i,num2.length()-1-i+1));
        }
        
        // 乘積結果 int[]
        int[] res_array=new int[num1.length()+num2.length()];
        // 個位值 int[][]
        int[][] weivalue=new int[num2.length()][num1.length()+num2.length()];
        // 進位值 int[][]
        int[][] jinwei=new int[num2.length()][num1.length()+num2.length()];
        // 求和進位 int[]
        int[] qiuhejinwei=new int[num1.length()+num2.length()+1];
        
        // 填充 個位值int[][] 和 進位值int[][]
        for(int i=0;i<num2_array.length;i++){
            for(int j=0;j<num1_array.length;j++){
                int mul=num2_array[i]*num1_array[j];
                int mulshiwei=(mul-mul%10)/10;
                int mulgewei=mul%10;
                jinwei[i][i+j+1]=mulshiwei;
                weivalue[i][i+j]=mulgewei;
            }
        }
        
        //列求和
        for(int i=0;i<res_array.length;i++){
            res_array[i]=0;
            for(int j=0;j<weivalue.length;j++){
                res_array[i]+=weivalue[j][i];
            }
            for(int j=0;j<jinwei.length;j++){
                res_array[i]+=jinwei[j][i];
            }
            res_array[i]+=qiuhejinwei[i];
                 
            int res_array_gewei=res_array[i]%10;
            int res_array_shiwei=(res_array[i]-res_array[i]%10)/10;
            qiuhejinwei[i+1]=res_array_shiwei;
            res_array[i]=res_array_gewei;
        }
        
        String res="";
        // 乘積結果int[]倒敘
        for(int i=res_array.length-1;i>=0;i--){
            res+=res_array[i]+"";
        } 
        // 去掉前面的0
        for(int i=0;i<res.length();i++){
            if(res.charAt(i)=='0'){
                res=res.substring(1);
                i--;
            }else{
                break;
            }
        }
        if(res.length()==0){
            return 0+"";
        }
        return res;
        
    }
}

思路2

不用記錄每個個位值和進位值,用到時再算。按列求和。

class Solution {
    public String multiply(String num1, String num2) {
        int[] num1_array=new int[num1.length()];
        for(int i=0;i<num1.length();i++){
            num1_array[i]=Integer.parseInt(num1.substring(num1.length()-1-i,num1.length()-1-i+1));
        }
        int[] num2_array=new int[num2.length()];
        for(int i=0;i<num2.length();i++){
            num2_array[i]=Integer.parseInt(num2.substring(num2.length()-1-i,num2.length()-1-i+1));
        }
        
        int[] res_array=new int[num1.length()+num2.length()+3];
        int qiuhejinwei=0;
        
        for(int k=0;k<res_array.length;k++){
            res_array[k]=0;
            // 取個位
            for(int i=0;i<num2_array.length;i++){
                int j=k-i;
                if(j>=num1_array.length || j<0){
                    continue;
                }
                res_array[k]+=(num1_array[j]*num2_array[i])%10;
            }
            // 取進位
            for(int i=0;i<num2_array.length;i++){
                int j=k-i-1;
                if(j>=num1_array.length || j<0){
                    continue;
                }
                res_array[k]+=(num1_array[j]*num2_array[i]-(num1_array[j]*num2_array[i])%10)/10;
            }
            // 加上求和進位
            res_array[k]+=qiuhejinwei;
                 
            int res_array_gewei=res_array[k]%10;
            int res_array_shiwei=(res_array[k]-res_array[k]%10)/10;
            qiuhejinwei=res_array_shiwei;
            res_array[k]=res_array_gewei;
        }
        
        String res="";
        for(int i=res_array.length-1;i>=0;i--){
            res+=res_array[i]+"";
        } 
        for(int i=0;i<res.length();i++){
            if(res.charAt(i)=='0'){
                res=res.substring(1);
                i--;
            }else{
                break;
            }
        }
        if(res.length()==0){
            return 0+"";
        }
        return res;
        
    }
}