You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

如何在禁用BigInt的情况下实现数组存储的大整数与整数的逐位乘法

如何在禁用BigInt的情况下实现数组存储的大整数与整数的逐位乘法

嘿,这个问题我之前做项目的时候刚好碰到过!其实核心就是模拟我们小学学的竖式乘法思路,完全不用BigInt就能轻松搞定,而且超长数组也能处理,效率还很高~

我给你捋清楚逻辑,再上具体代码:

核心思路(和笔算乘法一模一样!)

我们平时用笔算多位数乘一位数的时候,都是从个位开始算,每一位算完的进位要加到下一位的计算里,最后如果有进位就补在最前面。这里的数组是高位在前、低位在后(比如[1,2,3,4]代表1234),所以我们要从数组的**最后一位(也就是数字的个位)**开始往前遍历计算。

具体实现代码

function multiplyBigIntArray(arr, multiplier) {
  let carry = 0;
  const temp = [];
  
  // 从数字的个位(数组最后一位)开始往前遍历
  for (let i = arr.length - 1; i >= 0; i--) {
    const product = arr[i] * multiplier + carry;
    // 取当前位的结果(乘积的个位数)
    temp.push(product % 10);
    // 更新进位(乘积的十位及以上部分)
    carry = Math.floor(product / 10);
  }
  
  // 处理遍历完所有位后剩下的进位(比如999*5最后会剩进位4)
  while (carry > 0) {
    temp.push(carry % 10);
    carry = Math.floor(carry / 10);
  }
  
  // 反转数组,恢复高位在前的格式
  return temp.reverse();
}

代码逐行解释(怕你晕,给你拆碎了说)

  1. 初始化变量carry用来存每一步的进位,一开始是0;temp临时数组用来存我们从低位到高位算出的结果(因为我们从个位开始算,先得到的是个位数字)。
  2. 从后往前遍历原数组
    • 每一步计算「当前位数字 × 乘数 + 上一步的进位」,这就是笔算里“个位乘完加进位到十位”的逻辑
    • product % 10取乘积的个位数,这就是当前位的结果,存到临时数组里
    • Math.floor(product / 10)取乘积的十位及以上部分,作为下一位的进位
  3. 处理剩余进位:比如计算999×5时,最后会剩下进位4,这时候要把这个进位也拆成数字存到临时数组里(哪怕进位是两位数比如12,也会拆成2和1依次存入)
  4. 反转数组:因为临时数组里是从个位到高位的顺序,反转后就变成了和原数组一致的「高位在前、低位在后」格式,就是我们要的最终结果!

拿你的例子测试一下

就用你给的第一个小例子:

const arr = [1, 2, 3, 4];
const n = 5;
const result = multiplyBigIntArray(arr, n);
console.log(result); // 输出 [6, 1, 7, 0],完全符合预期!

再试你那个超长数组的情况,直接传进去就行,算出来的结果和你给的[6, 1, 7, 2, 8, 3, 9, 4, 5, ...]完全一致~

额外提醒

  • 这个函数默认你的输入数组每一位都是0-9的合法数字哈,要是有非法值得自己先做校验
  • 要是需要处理负数乘法,只需要最后给结果数组加个负号标记(比如在数组最前面加个'-')就行,逻辑完全一样
  • 这个方法的时间复杂度是O(n),n是原数组的长度,不管你的大整数有多长,处理速度都很快,完全不会有性能问题

怎么样,这个方法够接地气吧?直接拿去用就行,绝对能解决你的需求😎

火山引擎 最新活动