You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

JS质因数分解函数如何动态切换BigInt与Number类型适配数值大小

解决方案

我们可以在函数入口先完成输入值的类型判定和转换,再声明对应类型的基础常量,后续逻辑完全复用同一套即可,不需要写两套分支。

修改后的完整代码

function Factorize(dividend) {
  // 第一步:动态适配类型
  const maxSafe = Number.MAX_SAFE_INTEGER
  // 兼容传入Number或BigInt类型的输入
  let num = typeof dividend === 'bigint' ? dividend : BigInt(dividend)
  let useNumber = num <= BigInt(maxSafe)
  // 转换为对应类型
  let currentDividend = useNumber ? Number(num) : num
  // 声明对应类型的基础常量
  const ONE = useNumber ? 1 : 1n
  const ZERO = useNumber ? 0 : 0n
  let divisor = useNumber ? 2 : 2n

  let method1 = [], method2 = []
  while (currentDividend > ONE) {
    if (currentDividend % divisor === ZERO) {
      method1.push(`${divisor}`)
      method2.push(`${currentDividend} / ${divisor}`)
      currentDividend /= divisor
    } else {
      divisor++
    }
  }
  return {
    default: method1,
    detailed: method2,
    get isPrime() {
      // 修复原逻辑bug:2是质数,原判断会错误排除2
      return this.default.length === 1
    }
  }
}

// 调用时无需强制转BigInt,直接传Number即可
const number = parseInt(prompt())
console.log(Factorize(number))

关键修改点说明

  • 函数入口先统一把输入转成BigInt做大小判断,只要小于等于Number.MAX_SAFE_INTEGER就转成普通Number类型处理,否则保留BigInt
  • 声明了对应类型的基础常量ONE/ZERO/初始divisor,后续运算逻辑完全复用同一套,不需要针对两种类型写分支
  • 兼容Number和BigInt两种输入类型,调用时不需要额外做类型转换
  • 修复了原isPrime属性的逻辑错误:原逻辑会把质数2判定为非质数,现在调整为只要因数数组长度为1就判定为质数

内容的提问来源于stack exchange,提问作者Thomas

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.25 17:06:04