大數相乘-LeetCode43-字串相乘
阿新 • • 發佈:2018-12-04
題目
給定兩個以字串形式表示的非負整數 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; } }