Given two numbers represented as strings, return multiplication of the numbers as a string. Note that the numbers can be arbitrarily large and are non-negative.
From EPI
class BigInt {
BigInt(int capacity) {
sign = 1;
digits = new char[capacity];
}
BigInt(String s) {
sign = s.charAt(0) == '-' ? -1 : 1;
digits = new char[s.length() - (s.charAt(0) == '-' ? 1 : 0)];
for (int i = s.length() - 1, j = 0; i >= (s.charAt(0) == '-' ? 1 : 0); --i, ++j) {
if (Character.isDigit(s.charAt(i))) {
digits[j] = (char) (s.charAt(i) - '0');
}
}
}
BigInt multiply(BigInt n) {
BigInt result = new BigInt(digits.length + n.digits.length);
result.sign = sign * n.sign;
int i = 0, j = 0;
for (i = 0; i < n.digits.length; ++i) {
if (n.digits[i] != 0) {
int carry = 0;
for (j = 0; j < digits.length || carry > 0; ++j) {
int nDigit = result.digits[i + j]
+ (j < digits.length ? n.digits[i] * digits[j] : 0)
+ carry;
result.digits[i + j] = (char) (nDigit % 10);
carry = nDigit / 10;
}
}
}
// If one number is 0, the result size should be 0.
if ((digits.length == 1 && digits[0] == 0)
|| (n.digits.length == 1 && n.digits[0] == 0)) {
result.sign = 1;
result.digits = Arrays.copyOf(result.digits, 1);
} else {
result.digits = Arrays.copyOf(result.digits, i + j - 1);
}
return result;
}
}
Read full article from LeetCode - Multiply Strings | Darren's Blog
public String multiply(String num1, String num2) {
if (num1 == null || num1.length() == 0 ||
num2 == null || num2.length() == 0)
return "";
if (num1.equals("0") || num2.equals("0")) // Either one is 0
return "0";
int m = num1.length(), n = num2.length();
// Multiply single digit of each number and add up products at each position
int[] prods = new int[m+n];
for (int i = n-1; i >= 0; i--)
for (int j = m-1; j >= 0; j--)
prods[i+j+1] += (num2.charAt(i)-'0') * (num1.charAt(j)-'0');
// Keep a single digit at each position and add carry to a higher position
StringBuilder result = new StringBuilder();
for (int i = n+m-1; i >= 0; i--) {
result.insert(0, prods[i]%10);
if (i > 0)
prods[i-1] += prods[i] / 10; // Carry
}
// Get rid of one leaing "0" (if any)
if (result.charAt(0) == '0')
result.deleteCharAt(0);
return result.toString();
}
From EPI
class BigInt {
BigInt(int capacity) {
sign = 1;
digits = new char[capacity];
}
BigInt(String s) {
sign = s.charAt(0) == '-' ? -1 : 1;
digits = new char[s.length() - (s.charAt(0) == '-' ? 1 : 0)];
for (int i = s.length() - 1, j = 0; i >= (s.charAt(0) == '-' ? 1 : 0); --i, ++j) {
if (Character.isDigit(s.charAt(i))) {
digits[j] = (char) (s.charAt(i) - '0');
}
}
}
BigInt multiply(BigInt n) {
BigInt result = new BigInt(digits.length + n.digits.length);
result.sign = sign * n.sign;
int i = 0, j = 0;
for (i = 0; i < n.digits.length; ++i) {
if (n.digits[i] != 0) {
int carry = 0;
for (j = 0; j < digits.length || carry > 0; ++j) {
int nDigit = result.digits[i + j]
+ (j < digits.length ? n.digits[i] * digits[j] : 0)
+ carry;
result.digits[i + j] = (char) (nDigit % 10);
carry = nDigit / 10;
}
}
}
// If one number is 0, the result size should be 0.
if ((digits.length == 1 && digits[0] == 0)
|| (n.digits.length == 1 && n.digits[0] == 0)) {
result.sign = 1;
result.digits = Arrays.copyOf(result.digits, 1);
} else {
result.digits = Arrays.copyOf(result.digits, i + j - 1);
}
return result;
}
}
Read full article from LeetCode - Multiply Strings | Darren's Blog
No comments:
Post a Comment