Multiply Strings
Given two numbers represented as strings, return multiplication of the numbers as a string.
Note: The numbers can be arbitrarily large and are non-negative.
public class Solution {
public static String multiply(String num1, String num2) {
if(num1.equals("0") || num2.equals("0"))
return "0";
if (hasSign(num1))
num1 = num1.substring(1);
if (hasSign(num2))
num2 = num2.substring(1);
StringBuilder sb = new StringBuilder();
int len_1 = num1.length();
int len_2 = num2.length();
int flag_mul =0;
int tmp_1=0;
if (len_1 <= len_2) {
if (len_1 == 1) {
int tmp = Integer.parseInt(num1);
for (int i = 0; i < len_2; i++) {
tmp_1 = Integer.parseInt(num2.substring(len_2-1-i,len_2-i));
tmp_1 = tmp* tmp_1;
tmp_1 +=flag_mul;
flag_mul = tmp_1 /10;
tmp_1 = tmp_1%10;
sb.append(tmp_1);
}
if(flag_mul != 0 )
sb.append(flag_mul);
sb.reverse();
}else{
sb.append(0);
for(int i=0;i<len_1;i++){
String str_tmp = sb.toString();
sb.setLength(0);
sb.append(multiply(num1.substring(len_1-1-i,len_1-i), num2));
for(int j=i;j>0;j--){
sb.append(0);
}
String str_tmp_2 = StrAdd(str_tmp, sb.toString());
sb.setLength(0);
sb.append(str_tmp_2);
}
}
} else {
if (len_2 == 1) {
int tmp = Integer.parseInt(num2);
for (int i = 0; i < len_1; i++) {
tmp_1 = Integer.parseInt(num1.substring(len_1-1-i,len_1-i));
tmp_1 = tmp* tmp_1;
tmp_1 +=flag_mul;
flag_mul = tmp_1 /10;
tmp_1 = tmp_1%10;
sb.append(tmp_1);
}
if(flag_mul != 0 )
sb.append(flag_mul);
sb.reverse();
}else{
sb.append(0);
for(int i=0;i<len_2;i++){
String str_tmp = sb.toString();
sb.setLength(0);
sb.append(multiply(num2.substring(len_2-1-i,len_2-i), num1));
for(int j=i;j>0;j--){
sb.append(0);
}
String str_tmp_2 = StrAdd(str_tmp, sb.toString());
sb.setLength(0);
sb.append(str_tmp_2);
}
}
}
return sb.toString();
}
public static String StrAdd(String num1, String num2) {
StringBuilder sb = new StringBuilder();
if (hasSign(num1))
num1 = num1.substring(1);
if (hasSign(num2))
num2 = num2.substring(1);
sb.setLength(0);
int len_1 = num1.length();
int len_2 = num2.length();
boolean flag_add = false;
int tmp = 0;
if (len_1 <= len_2) {
for (int i = 0; i < len_1; i++) {
tmp = Integer
.parseInt(num1.substring(len_1 - 1 - i, len_1 - i))
+ Integer.parseInt(num2.substring(len_2 - 1 - i, len_2
- i));
if (flag_add == true) {
tmp++;
flag_add = false;
}
if (tmp >= 10) {
tmp -= 10;
flag_add = true;
}
sb.append(tmp);
}
for (int i = len_1; i < len_2; i++) {
tmp = Integer
.parseInt(num2.substring(len_2 - 1 - i, len_2 - i));
if (flag_add == true) {
tmp++;
flag_add = false;
}
if (tmp >= 10) {
tmp -= 10;
flag_add = true;
}
sb.append(tmp);
}
if (flag_add == true) {
flag_add = false;
sb.append(1);
}
} else {
for (int i = 0; i < len_2; i++) {
tmp = Integer
.parseInt(num1.substring(len_1 - 1 - i, len_1 - i))
+ Integer.parseInt(num2.substring(len_2 - 1 - i, len_2
- i));
if (flag_add == true) {
tmp++;
flag_add = false;
}
if (tmp >= 10) {
tmp -= 10;
flag_add = true;
}
sb.append(tmp);
}
for (int i = len_2; i < len_1; i++) {
tmp = Integer
.parseInt(num1.substring(len_1 - 1 - i, len_1 - i));
if (flag_add == true) {
tmp++;
flag_add = false;
}
if (tmp >= 10) {
tmp -= 10;
flag_add = true;
}
sb.append(tmp);
}
if (flag_add == true) {
flag_add = false;
sb.append(1);
}
}
return sb.reverse().toString();
}
public static boolean hasSign(String num) {
if (num.charAt(0) == '-' || num.charAt(0) == '+')
return true;
else
return false;
}
}