「这是我参与2022首次更文挑战的第17天,活动详情查看:2022首次更文挑战」。
说在前面
平时我们做计算的时候只需要将需要计算的式子输入给计算机,计算机就会返回其计算结果给我们,但不知道你们有没有发现,在式子中的数字过大时,返回的结果和我们想象中的结果就会变得不一样,就像下面这个式子一样:
1111111111111111111111111 + 1111111111111111111111111 = 2222222222222222222222222 正常来说我们输入1111111111111111111111111 + 1111111111111111111111111这个式子,计算机返回的计算结果应该是2222222222222222222222222,但事实上呢,让我们打开控制台试一下,返回的结果如下:2.2222222222222222e+24,其实这个结果其实是科学记数法,转换过来也就是我们计算的结果,但是我们能不能让电脑返回和我们计算得出一样的值呢?这样我们看起来也会更加地直观。答案是可以的,我们可以通过字符串来模拟竖式的运算过程,然后来求出结果。
字符串相加
在leetcode上有一道类似的题目,有兴趣的同学可以先自己去尝试一下。
题目链接
题目描述
给定两个字符串形式的非负整数 num1 和num2 ,计算它们的和并同样以字符串形式返回。
你不能使用任何內建的用于处理大整数的库(比如 BigInteger), 也不能直接将输入的字符串转换为整数形式。
示例 1:
输入: num1 = "11", num2 = "123"
输出: "134"
示例 2:
输入: num1 = "456", num2 = "77"
输出: "533"
思路
简单来说就是要模拟一个加法竖式的运算过程
- 1、个位数对齐,从后往前依次相加
- 2、检查是否需要进位和是否有进位
- 3、两个字符串都遍历完时即可得出结果
代码
/**
* @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;
};
说在后面
除了加法之外,减法、乘法和除法也可以进行类似的转换计算,大家有兴趣的都可以自己去试一下。最后祝大家新年快乐,万事如意。