作为大龄失业青年,在这个就业率低的时代,我也很无奈。
但是!!!!
八股文,该背还得背
那么
对于面试中的遇到的大数相加,我们应该如何快速记住呢~~~~
特别提示⚠️:小菜鸟自嗨中,大佬可以麻烦退出,不浪费时间
首先,啥叫大数,难道 “+” 不能满足我的需要吗?
JavaScript 的原生数值类型有限制,无法处理超出一定范围的大整数或高精度浮点数。处理大数(Big Numbers)运算通常需要使用专门的库。
JavaScript 引入了 BigInt 类型,它允许你处理大整数,这是 ES11(ECMAScript 2020)的新特性。BigInt 可以用于进行整数运算,而不会受到 JavaScript Number 类型的范围限制。
const bigIntA = BigInt('123456789012345678901234567890');
const bigIntB = BigInt('987654321098765432109876543210');
const result = bigIntA + bigIntB;
console.log(result);
好的,正文开始,先让我们准备一些测试数据
'9007199254740991', '1234567899999999999'
首先,转换输入的数字字符串为数组,每个元素代表一个数字位。
const numA = a.split('').map(Number);
const numB = b.split('').map(Number);
取两个数组的最大长度
const maxLength = Math.max(numA.length, numB.length);
为什么要这么干呢,因为我们不能保证用户输入的数据长度是一致滴~~~
好的,用0来补齐长度
numA.unshift(...Array(maxLength - numA.length).fill(0));
numB.unshift(...Array(maxLength - numB.length).fill(0));
这个时候
numA: [0, 0, 0, 9, 0, 0, 7, 1, 9, 9, 2, 5, 4, 7, 4, 0, 9, 9, 1]
numB: [1, 2, 3, 4, 5, 6, 7, 8, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9]
好的,非常好,那么接下来,需要去模拟加法过程,
什么,要我去告诉计算机怎么加????
最终返回的是一个数组,当然是 join 之后的。当然,还需要定义加法过程中需要用到的变量
let carry = 0; // 进位
const sum = [];
//...
return sum.join("");
想想小学怎么计算 9+9。
9+9 等于 18,先写 8
怎么算出8,两个数组相加,有进位,就加进位,然后 18 % 10,就是18
for (let i = maxLength - 1; i >= 0; i--) {
const total = numA[i] + numB[i] + carry;
const digit = total % 10;
sum.unshift(digit);
}
如果进位大于1,则需要把进位一个 push 到数组中。
for (let i = maxLength - 1; i >= 0; i--) {
const total = numA[i] + numB[i] + carry;
//...
carry = Math.floor(total / 10);
//...
}
if (carry > 0) {
sum.unshift(carry);
}
组合一下代码
function add(a, b) {
// 转换输入的数字字符串为数组,每个元素代表一个数字位
const numA = a.split('').map(Number);
const numB = b.split('').map(Number);
// 取两个数组的最大长度
const maxLength = Math.max(numA.length, numB.length);
// 用0来补齐长度
numA.unshift(...Array(maxLength - numA.length).fill(0));
numB.unshift(...Array(maxLength - numB.length).fill(0));
// 定义加法过程中需要用到的变量
let carry = 0; // 进位
const sum = [];
for (let i = maxLength - 1; i >= 0; i--) {
const total = numA[i] + numB[i] + carry;
const digit = total % 10;
carry = Math.floor(total / 10);
sum.unshift(digit);
}
if (carry > 0) {
sum.unshift(carry);
}
return sum.join('');
}