BigNumberMultiplication
Problem description
Given two numbers represented as digits per entry in array, return an integer as their product.
public List<Integer> BigNumberMultiplication(int[] num1, int[] num2) {
/*
* Time complexity O(nm)
*/
// if both numbers are negative, their product would be positive
boolean isNegative = (num1[0] < 0 && num2[0] >= 0) || (num1[0] >= 0 && num2[0] < 0);
num1[0] = Math.abs(num1[0]);
num2[0] = Math.abs(num2[0]);
List<Integer> result = new ArrayList<Integer>(num1.length + num2.length);
for (int i = 0; i < num1.length + num2.length; ++i) {
result.add(0);
}
for (int i = num1.length - 1; i >= 0; i--) {
for (int j = num2.length - 1; j >= 0; j--) {
result.set(i + j, result.get(i + j) + num1[i] * num2[j]);
result.set(i + j + 1, result.get(i + j + 1) + result.get(i + j) / 10);
result.set(i + j, result.get(i + j) % 10);
}
}
// Skips the leading 0s and keeps one 0 if all are 0s.
while (result.size() != 1 && result.get(result.size() - 1) == 0) {
result.remove(result.size() - 1);
}
Collections.reverse(result);
if (isNegative) {
result.set(0, result.get(0) * -1);
}
return result;
}
String multiply
public String multiply(String num1, String num2) {
if (num1 == null || num2 == null || num1.length() == 0 || num2.length() == 0)
return null;
char[] num1Array = new StringBuilder(num1).reverse().toString().toCharArray();
char[] num2Array = new StringBuilder(num2).reverse().toString().toCharArray();
List<Integer> result = new ArrayList<Integer>(num1.length() + num2.length());
for (int i = 0; i < num1.length() + num2.length(); ++i) {
result.add(0);
}
for (int i = 0; i < num1Array.length; i++) {
for (int j = 0; j < num2Array.length;j++) {
int product = (num1Array[i] - '0') * (num2Array[j] - '0');
result.set(i + j, result.get(i + j) + product);
result.set(i + j + 1, result.get(i + j + 1) + result.get(i + j) / 10);
result.set(i + j, result.get(i + j) % 10);
}
}
// Skips the leading 0s and keeps one 0 if all are 0s.
while (result.size() != 1 && result.get(result.size() - 1) == 0) {
result.remove(result.size() - 1);
}
Collections.reverse(result);
StringBuilder sb = new StringBuilder(result.size());
for (int i : result)
sb.append(i);
return sb.toString();
}