# Multiplying and adding big numbers represented with strings

I got a very unusual problem of adding and multiplying very big numbers (≥ 1e+100). So I've written simple functions that would operate on string representations of numbers, both as an input and an output.

Multiplication:

function multiply(a, b) {
if ((a | 0) == 0 || (b | 0) == 0) {
return '0';
}

a = a.split('').reverse();
b = b.split('').reverse();
var result = [];

for (var i = 0; a[i] >= 0; i++) {
for (var j = 0; b[j] >= 0; j++) {
if (!result[i + j]) {
result[i + j] = 0;
}

result[i + j] += a[i] * b[j];
}
}

for (var i = 0; result[i] >= 0; i++) {
if (result[i] >= 10) {
if (!result[i + 1]) {
result[i + 1] = 0;
}

result[i + 1] += parseInt(result[i] / 10);
result[i] %= 10;
}
}

return result.reverse().join('');
}


function add(a, b) {
if ((a | 0) == 0 && (b | 0) == 0) {
return '0';
}

a = a.split('').reverse();
b = b.split('').reverse();
var result = [];

for (var i = 0; (a[i] >= 0) || (b[i] >= 0); i++) {
var sum = (parseInt(a[i]) || 0) + (parseInt(b[i]) || 0);

if (!result[i]) {
result[i] = 0;
}

var next = ((result[i] + sum) / 10) | 0;
result[i] = (result[i] + sum) % 10;

if (next) {
result[i + 1] = next;
}
}

return result.reverse().join('');
}


Are there better ways of doing this job? Some additional edge cases or better loop conditions, maybe?

• Unless this is just for fun you'd be better off looking for a bignum library instead. Commented Jun 8, 2015 at 11:02
• Take a look at javascript-bignum; I'm quite fond of it. (I'd review your code if I did enough Javascript to understand half of it)
– anon
Commented Jun 8, 2015 at 12:47
• Your function works for small numbers but for large numbers, it is not working. e.g. multiply('1111','222222222222222222222222222222') resulted in 0. Fix it please. Commented Mar 1, 2018 at 20:09

### Use the correct functions to convert to types

I think you are using the bitwise | to convert a string to a number:

if ((a | 0) == 0 || (b | 0) == 0) {
return '0';
}


I think parseInt can show this intent more clearly:

if (parseInt(a) == 0 || parseInt(b) == 0) {
return '0';
}

• That would get you an Integer not any number (floating point). Not a big difference, but it would be helpful to point it out as you wouldn't use it just anywhere Commented Jan 10, 2016 at 13:44