package com.freetymekiyan.algorithms.level.medium;
/**
* Given two numbers represented as strings, return multiplication of the numbers as a string.
* <p>
* Note:
* The numbers can be arbitrarily large and are non-negative.
* Converting the input string to integer is NOT allowed.
* You should NOT use internal library such as BigInteger.
* <p>
* Company Tags: Facebook, Twitter
* Tags: Math, String
* Similar Problems: (M) Add Two Numbers, (E) Plus One, (E) Add Binary, (E) Add Strings
*/
public class MultiplyStrings {
/**
* Math. String.
* How to do multiplication?
* Start from right to left, multiply each pair of digits, and add them together.
* Result num1[i] * num2[j] will be placed at i + j and i + j + 1.
* Mimic this process.
* Special cases:
* 1) If one of the strings is null, return empty.
* 2) If one of the strings is zero, return zero.
*/
public String multiply(String num1, String num2) {
if (num1 == null || num2 == null) {
return "";
}
if ("0".equals(num1) || "0".equals(num2)) { // If one number is 0.
return "0";
}
int m = num1.length(), n = num2.length();
int[] product = new int[m + n]; // Length is at most m + n.
// Pick one digit from one number, multiply with each digit in the other number.
for (int i = m - 1; i >= 0; i--) { // From right to left, from lower significant digit to higher.
for (int j = n - 1; j >= 0; j--) {
int mul = (num1.charAt(i) - '0') * (num2.charAt(j) - '0');
int p1 = i + j, p2 = i + j + 1; // p1 is a more significant digit than p2.
int sum = mul + product[p2];
product[p1] += sum / 10; // Carry.
product[p2] = sum % 10;
}
}
StringBuilder ans = new StringBuilder();
for (int p : product) {
if (p != 0 || ans.length() != 0) { // Not zero, or not empty.
ans.append(p);
}
}
return ans.toString();
}
}