返回

字符串形式存储大数实现大数相加、大数相乘

前端

对于大数的计算,JavaScript 的数字类型可能无法满足,因为 JavaScript 的数字类型是双精度浮点数,大约有 17 位有效数字,超过这个范围后结果损失精度。因此,若要计算大数,可以使用字符串的方式来存储大数。

大数相加

使用字符串来存储大数时,字符串中的每一个字符可以代表数字,比如“12345”这个字符串可以表示数字 12345。为了进行大数相加,可以将两个大数分别存储在两个字符串中,然后从右往左依次相加每个字符所代表的数字,如果相加的结果大于 9,则进位到下一位,否则直接把结果放在下一位。

function bigIntegerAdd(str1, str2) {
    // 将两个字符串反转
    str1 = str1.split('').reverse().join('');
    str2 = str2.split('').reverse().join('');

    // 比较两个字符串的长度,并以较长的字符串为准
    let maxLength = Math.max(str1.length, str2.length);

    // 初始化结果字符串
    let result = '';

    // 进位标志
    let carry = 0;

    // 从右往左依次相加每个字符所代表的数字
    for (let i = 0; i < maxLength; i++) {
        // 获取两个字符串对应位置的字符
        let num1 = parseInt(str1[i] || '0');
        let num2 = parseInt(str2[i] || '0');

        // 相加,并加上进位标志
        let sum = num1 + num2 + carry;

        // 如果相加结果大于 9,则进位到下一位,否则直接把结果放在下一位
        if (sum >= 10) {
            carry = 1;
            result = (sum - 10) + result;
        } else {
            carry = 0;
            result = sum + result;
        }
    }

    // 如果最后还有进位,则加上进位标志
    if (carry > 0) {
        result = carry + result;
    }

    // 将结果字符串反转并返回
    return result.split('').reverse().join('');
}

大数相乘

使用字符串来存储大数时,大数相乘与普通数字相乘类似,只不过需要考虑进位的问题。可以将两个大数分别存储在两个字符串中,然后从右往左依次相乘每个字符所代表的数字,如果相乘的结果大于 9,则进位到下一位,否则直接把结果放在下一位。

function bigIntegerMultiply(str1, str2) {
    // 将两个字符串反转
    str1 = str1.split('').reverse().join('');
    str2 = str2.split('').reverse().join('');

    // 比较两个字符串的长度,并以较长的字符串为准
    let maxLength = Math.max(str1.length, str2.length);

    // 初始化结果字符串
    let result = '';

    // 进位标志
    let carry = 0;

    // 从右往左依次相乘每个字符所代表的数字
    for (let i = 0; i < maxLength; i++) {
        // 获取两个字符串对应位置的字符
        let num1 = parseInt(str1[i] || '0');
        let num2 = parseInt(str2[i] || '0');

        // 相乘,并加上进位标志
        let product = num1 * num2 + carry;

        // 如果相乘结果大于 9,则进位到下一位,否则直接把结果放在下一位
        if (product >= 10) {
            carry = Math.floor(product / 10);
            result = (product % 10) + result;
        } else {
            carry = 0;
            result = product + result;
        }
    }

    // 如果最后还有进位,则加上进位标志
    if (carry > 0) {
        result = carry + result;
    }

    // 将结果字符串反转并返回
    return result.split('').reverse().join('');
}

这种使用字符串的方式来存储和操作大数的方法虽然比较简单,但是效率不高,因为需要不断地进行字符串拼接和转换,尤其是当大数的位数非常多的时候,效率会非常低。在实际应用中,通常会使用更高效的算法和数据结构来进行大数的计算。