HiveBrain v1.2.0
Get Started
← Back to all entries
patternjavascriptMinor

Multiplying and adding big numbers represented with strings

Submitted by: @import:stackexchange-codereview··
0
Viewed 0 times
representedwithmultiplyingnumbersaddingbigandstrings

Problem

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?

Solution

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';
}

Code Snippets

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

Context

StackExchange Code Review Q#92966, answer score: 2

Revisions (0)

No revisions yet.