[leetcode]43. Multiply Strings
阿新 • • 發佈:2018-12-08
一開始以為是分治遞迴的那種大整數相乘,還發現了一個牛逼演算法,但是這個演算法還是不能超過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; } }