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
相关产品推荐
相关产品推荐

