/* * 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(); }