package com.interview.string; /** * https://leetcode.com/discuss/questions/oj/multiply-strings */ public class MultiplyStrings { public String multiply(String num1, String num2) { String output = multiply(num1, num2, 0, num1.length() - 1, 0, num2.length() - 1); return output; } private String multiply(String num1, String num2, int start1, int end1, int start2, int end2) { if (end1 - start1 == 0 || end2 - start2 == 0) { return simpleMultiply(num1.substring(start1, end1 + 1), num2.substring(start2, end2 + 1)); } int mid1 = (start1 + end1)/2; int mid2 = (start2 + end2)/2; int count1 = end1 - mid1; int count2 = end2 - mid2; String v1 = multiply(num1, num2, start1, mid1, start2, mid2); String v2 = multiply(num1, num2, start1, mid1, mid2 + 1, end2); String v3 = multiply(num1, num2, mid1 + 1, end1, start2, mid2); String v4 = multiply(num1, num2, mid1 + 1, end1, mid2 + 1, end2); v1 = append0s(v1, count1 + count2); v2 = append0s(v2, count1); v3 = append0s(v3, count2); v1 = add(v1.toCharArray(), v2.toCharArray()); v3 = add(v3.toCharArray(), v4.toCharArray()); return add(v1.toCharArray(), v3.toCharArray()); } private String simpleMultiply(String num1, String num2) { String smaller; String larger; if (num1.length() == 1) { smaller = num1; larger = num2; } else { smaller = num2; larger = num1; } int r2 = smaller.charAt(0) - '0'; if (r2 == 0) { return "0"; } int carry = 0; StringBuffer stringBuffer = new StringBuffer(); for (int i = larger.length() - 1; i >= 0; i--) { int r1 = larger.charAt(i) - '0'; int r = r1 * r2 + carry; stringBuffer.append(r%10); carry = r / 10; } if (carry != 0) { stringBuffer.append(carry); } return stringBuffer.reverse().toString(); } private String append0s(String v1, int count ) { StringBuffer buff = new StringBuffer(v1); for (int i = 0; i < count; i++) { buff.append("0"); } return buff.toString(); } public String add(char[] num1,char[] num2){ int index1 = num1.length -1; int index2 = num2.length -1; int carry = 0; StringBuffer buffer = new StringBuffer(); while(index1 >= 0 && index2 >= 0){ int r1 = num1[index1] - '0'; int r2 = num2[index2] - '0'; int r = r1 + r2 + carry; buffer.append(r%10); carry = r/10; index1--; index2--; } while(index1 >= 0){ int r1 = num1[index1] - '0'; int r = r1 + carry; buffer.append(r%10); carry = r/10; index1--; } while(index2 >= 0){ int r2 = num2[index2] - '0'; int r = r2 + carry; buffer.append(r%10); carry = r/10; index2--; } if (carry != 0) { buffer.append(carry); } return buffer.reverse().toString(); } public static void main(String args[]) { MultiplyStrings ms = new MultiplyStrings(); System.out.print(ms.multiply("6752716719037375654442652725945722915786612669126862029212","2840271321219335147")); } }