如何快速记住大数相加的代码

66 阅读3分钟

作为大龄失业青年,在这个就业率低的时代,我也很无奈。

但是!!!!

八股文,该背还得背

那么

对于面试中的遇到的大数相加,我们应该如何快速记住呢~~~~

特别提示⚠️:小菜鸟自嗨中,大佬可以麻烦退出,不浪费时间

首先,啥叫大数,难道 “+” 不能满足我的需要吗?

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

image.png

9+9 等于 18,先写 8

image.png

怎么算出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('');
}