var multiply = (num1, num2) => {
const isZero = ((num1 === '0') || (num2 === '0'));
if (isZero) return '0';
const buffer = initBuffer(num1, num2);
multiplication(num1, num2, buffer)
removeLeadingZero(buffer);
return buffer.join('');
};
var initBuffer = (num1, num2) => {
const size = (num1.length + num2.length);
return new Array(size).fill(0);
}
var multiplication = (num1, num2, buffer) => {
for (let i = (num1.length - 1); (0 <= i); i--) {
for (let j = (num2.length - 1); (0 <= j); j--) {
update(num1, i, num2, j, buffer);
}
}
}
var removeLeadingZero = (buffer) => {
const isLeadZero = (buffer[0] === 0);
if (!isLeadZero) return;
buffer.shift();
}
var update = (num1, i, num2, j, buffer) => {
const curPos = (i + j);
const prevPos = curPos + 1;
const carry = buffer[prevPos];
const product = getProduct(num1, i, num2, j);
const sum = (carry + product);
const remainder = (sum % 10);
const value = ((sum - remainder) / 10);
buffer[prevPos] = remainder;
buffer[curPos] += value;
}
var getProduct = (num1, i, num2, j) => {
const [ iNum, jNum ] = [ Number(num1[i]), Number(num2[j]) ];
return (iNum * jNum);
}
var multiply = (num1, num2) => {
const isZero = ((num1 === '0') || (num2 === '0'));
if (isZero) return '0';
const buffer = initBuffer(num1, num2);
multiplication(num1, num2, buffer);
removeLeadingZero(buffer);
return buffer.join('');
};
var initBuffer = (num1, num2) => new Array(num1.length + num2.length).fill(0);
var multiplication = (num1, num2, buffer) => {
[ num1, num2 ] =
[ reverse(num1), reverse(num2) ];
for (var i1 in num1) {
for (var i2 in num2) {
update(num1, i1, num2, i2, buffer);
}
}
buffer.reverse();
}
const reverse = (s) => s
.split('')
.reverse();
var update = (num1, i1, num2, i2, buffer) => {
const product = num1[i1] * num2[i2];
const index = Number(i1) + Number(i2);
buffer[index] += product;
buffer[(index + 1)] += Math.floor(buffer[index] / 10);
buffer[index] = (buffer[index] % 10);
}
var removeLeadingZero = (buffer) => {
const isZero = (buffer[0] === 0);
if (!isZero) return;
buffer.shift();
}