字符串相乘 Javascript 解法代码

112 阅读1分钟

100% 原创

/**
 * @param {string} num1
 * @param {string} num2
 * @return {string}
 */
var add = function(a, b) {
    a = a + '';
    b = b + '';
    if (a.length < b.length) {
        let temp = a;
        a = b;
        b = temp;
    }
    let len = a.length;
    a = a.split('').reverse();
    b = b.split('').reverse();
    let result = [];
    for (let i = 0; i < len; ++i) {
        result[i] = result[i] || 0;
        let res = parseInt(a[i]) + parseInt(b[i] || 0) + result[i];
        if (res > 9) {
            result[i] = res % 10;
            result[i + 1] = (result[i + 1] || 0) + Math.floor(res / 10);
        } else {
            result[i] = res;
        }
    }
    return result.reverse().join('');
}
var multiply = function(num1, num2) {
    // 保证 num1 长度 >= num2
    if(num1.length < num2.length) {
        temp = num1;
        num1 = num2;
        num2 = temp;
    }
    let len1 = num1.length;
    let len2 = num2.length;
    let adders = [];
    for(let i = 0; i < len1; ++i) {
        for(let j = 0; j < len2; ++j) {
            const a = parseInt(num1[i]);
            const b = parseInt(num2[j]);
            adders.push({
                value: a * b,
                exp: len1 - i + len2 - j - 2,
            });
        }
    }
    // console.log(JSON.stringify(adders));
    adders.sort((a, b) => a.exp - b.exp);
    for(let i = 0; i < adders.length - 1; ++i) {
        while(adders[i].exp === adders[i + 1].exp) {
            adders[i].value = add(adders[i].value, adders[i + 1].value);
            adders.splice(i + 1, 1);
            i--;
        }
    }
    // console.log(JSON.stringify(adders));
    for(let i = 0; i < adders.length; ++i) {
        let obj = adders[i];
        if (parseInt(obj.value) > 9) {
            adders[i + 1] = adders[i + 1] || {
                value: 0,
                exp: i + 1,
            };
            let str = obj.value + '';
            obj.value = str[str.length - 1];
            adders[i + 1].value = add(adders[i + 1].value, str.slice(0, str.length - 1));
        }
    }
    let result = adders.map(el => el.value).reverse();
    while(result.length > 1 && result[0] == 0) {
        result.shift();
    }
    return result.join('');
};