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('');
}
Addition:
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?