JavaScript实现大数求和

626 阅读3分钟

「这是我参与2022首次更文挑战的第17天,活动详情查看:2022首次更文挑战」。

说在前面

平时我们做计算的时候只需要将需要计算的式子输入给计算机,计算机就会返回其计算结果给我们,但不知道你们有没有发现,在式子中的数字过大时,返回的结果和我们想象中的结果就会变得不一样,就像下面这个式子一样:

1111111111111111111111111 + 1111111111111111111111111 = 2222222222222222222222222 正常来说我们输入1111111111111111111111111 + 1111111111111111111111111这个式子,计算机返回的计算结果应该是2222222222222222222222222,但事实上呢,让我们打开控制台试一下,返回的结果如下:2.2222222222222222e+24,其实这个结果其实是科学记数法,转换过来也就是我们计算的结果,但是我们能不能让电脑返回和我们计算得出一样的值呢?这样我们看起来也会更加地直观。答案是可以的,我们可以通过字符串来模拟竖式的运算过程,然后来求出结果。

字符串相加

在leetcode上有一道类似的题目,有兴趣的同学可以先自己去尝试一下。

题目链接

415. 字符串相加

题目描述

给定两个字符串形式的非负整数 num1 和num2 ,计算它们的和并同样以字符串形式返回。 你不能使用任何內建的用于处理大整数的库(比如 BigInteger), 也不能直接将输入的字符串转换为整数形式。

示例 1:

输入: num1 = "11", num2 = "123"
输出: "134"

示例 2:

输入: num1 = "456", num2 = "77"
输出: "533"

思路

简单来说就是要模拟一个加法竖式的运算过程

  • 1、个位数对齐,从后往前依次相加
  • 2、检查是否需要进位和是否有进位
  • 3、两个字符串都遍历完时即可得出结果 1643892589(1).jpg

代码

/**
 * @param {string} num1
 * @param {string} num2
 * @return {string}
 */
var addStrings = function(num1, num2) {
    let i = num1.length - 1, j = num2.length - 1, add = 0;
    let ans = '';
    //从后往前遍历
    while (i >= 0 || j >= 0 || add != 0) {
        //每一位转换为数字
        const x = i >= 0 ? num1.charAt(i) - '0' : 0;
        const y = j >= 0 ? num2.charAt(j) - '0' : 0;
        //保存该位的计算结果
        const result = x + y + add;
        ans = (result % 10) + ans;
        add = Math.floor(result / 10);
        i -= 1;
        j -= 1;
    }
    return ans;
};

说在后面

除了加法之外,减法、乘法和除法也可以进行类似的转换计算,大家有兴趣的都可以自己去试一下。最后祝大家新年快乐,万事如意。