You need to enable JavaScript to run this app. JavaScript质数检查函数传入25时错误返回true问题排查
优惠活动
大模型
产品
解决方案
定价
更多

JavaScript质数检查函数传入25时错误返回true问题排查

质数检查函数逻辑错误排查与修正

问题根源

该代码存在根本性的逻辑偏差:将「不能被2和3整除」的属性直接等价于质数,完全没有覆盖其他可能的质因数校验场景。
原判断代码如下:

function isPrime(number) {
   return number % 2 !== 0 && number % 3 !== 0 ? true : false;
}

传入25时出现误判的原因很明确:25除以2余1,满足number % 2 !== 0的条件;25除以3余1,满足number % 3 !== 0的条件。两个判断条件全部通过,函数自然返回true。
本质上所有不含2、3作为因数的合数,都会被这个残缺逻辑误判为质数,比如25(55)、35(57)、49(77)、55(511)都属于这类误判场景。

为什么之前的测试用例结果符合预期

  • isPrime(4)返回false:4能被2整除,刚好被当前逻辑的排除条件命中,结果正确
  • isPrime(23)返回true:23是标准质数,本身就不能被2、3整除,自然通过判断,结果正确
    这两个测试用例刚好都落在了当前残缺逻辑能覆盖的判断区间内,没有触发误判分支。

正确的实现方案

质数的严格定义是:大于1的自然数,除了1和它自身外,不存在其他正因数。基于这个定义实现的判断逻辑可以参考如下规则:

  • 先处理边界情况:小于2的数直接返回false;等于2的数直接返回true;能被2整除的大于2的偶数直接返回false
  • 校验因数时不需要遍历到目标数本身,只需要遍历到目标数的平方根即可——如果一个数n存在大于其平方根的因数,必然存在一个对应的、小于等于平方根的因数,能大幅减少循环次数
  • 遍历过程中跳过偶数,只校验奇数因子,进一步降低计算量
    修正后的参考代码:
function isPrime(number) {
  // 小于2的数不是质数
  if (number < 2) return false;
  // 2是唯一的偶质数
  if (number === 2) return true;
  // 大于2的偶数都不是质数
  if (number % 2 === 0) return false;
  // 从3开始,只检查奇数因子,遍历到目标数的平方根
  for (let i = 3; i <= Math.sqrt(number); i += 2) {
    if (number % i === 0) return false;
  }
  return true;
}

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.11.03 18:36:03