標籤:
/* * 43.Multiply Strings * 2016-5-4 by Mingyang 很像一個乘除法的計算機 * 我的這種做法確實無可厚非,但是如果對於特殊的客戶,比如說無限大的數乘以無限大的數 * 那麼我就不能老老實實的乘了,會溢出。就可以把每一位存在一個數組裡面 * 利用前面做加減法的演算法,A[0]*B[0]=C[0]每一位對應的寫在C的對應位上,然後不斷地累積 */ //我的最最原始的解法 public static String multiply(String num1, String num2) { if (num1.length() == 0 || num1 == null || num2.length() == 0|| num2 == null) return ""; int len1 = num1.length(); int len2 = num2.length(); num1 = new StringBuffer(num1).reverse().toString(); num2 = new StringBuffer(num2).reverse().toString(); double res = 0; String result = ""; for (int i = 0; i < len1; i++) { int temp = 0; int next = 0; StringBuffer sb = new StringBuffer(); for (int j = 0; j < len2; j++) { int n1 = num1.charAt(i) - ‘0‘; int n2 = num2.charAt(j) - ‘0‘; temp = next + n1 * n2; next = temp / 10; sb.append(temp % 10); } res = res + Integer.parseInt(sb.reverse().toString())* Math.pow(10.0, (double) i); } if (res > Integer.MAX_VALUE) return ""; result = Double.toString(res); return result; } //思路和2一樣了,自己的實現 public static String multiply1(String num1, String num2) { int len1=num1.length(); int len2=num2.length(); if(num1==null||len1==0||num2==null||len2==0||num1.equals("0")||num2.equals("0")) return "0"; char[] array1=num1.toCharArray(); char[] array2=num2.toCharArray(); int[] res=new int[len1+len2]; for(int i=len1-1;i>=0;i--){ for(int j=len2-1;j>=0;j--){ int s=len1-1-i+len2-1-j; res[s]=res[s]+(array1[i]-‘0‘)*(array2[j]-‘0‘); if(res[s]>9){ res[s+1]+=res[s]/10; res[s]=res[s]%10; } } } StringBuffer sb=new StringBuffer(); for(int i=0;i<res.length-1;i++){ sb.append(res[i]); } //這裡不要忘了,因為不好估計C的位元,多出的一位是0的時候需要去掉不加 if(res[res.length-1]!=0) sb.append(res[res.length-1]); sb.reverse(); return sb.toString(); } //網上的解法,比如你的i位我的j位,我們乘在一起以後就是i+j位的數組裡面,這樣就比較好一點 //比我好的地方就是把string reverse了一下,便於計算 public static String multiply2(String num1, String num2) { num1 = new StringBuilder(num1).reverse().toString(); num2 = new StringBuilder(num2).reverse().toString(); // even 99 * 99 is < 10000, so maximaly 4 digits int[] d = new int[num1.length() + num2.length()]; for (int i = 0; i < num1.length(); i++) { int a = num1.charAt(i) - ‘0‘; for (int j = 0; j < num2.length(); j++) { int b = num2.charAt(j) - ‘0‘; d[i + j] += a * b; } } StringBuilder sb = new StringBuilder(); for (int i = 0; i < d.length; i++) { int digit = d[i] % 10; int carry = d[i] / 10; sb.insert(0, digit); // 這一步很關鍵,因為會出邊界,就是最後進的那一位 if (i < d.length - 1) d[i + 1] += carry; } // trim starting zeros while (sb.length() > 0 && sb.charAt(0) == ‘0‘) { sb.deleteCharAt(0); } return sb.length() == 0 ? "0" : sb.toString(); }
43.Multiply Strings