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

两段质数判断函数代码为何一段正常运行一段失效?求技术解析

两段质数判断函数代码为何一段正常运行一段失效?求技术解析

兄弟我懂你刚学编程的困惑!咱们来拆解一下这两段代码的核心差异,你马上就明白为啥第一个翻车了~

先看失效代码的问题根源

function checkIsPrime(num) {
  if (num === 1) {
    return false
  }
  for(let i = 2; i < num ; i++){
    if (num % i == 0) {
      return false
    }   else {
      return true
    }
  }
}

问题出在循环里的else { return true }!咱们拿你说的数字15来走一遍流程:

  • 进入循环,第一次i=2,计算15%2结果是1,不等于0,所以直接进入else分支,立刻返回true
  • 这时候函数直接终止了,根本没机会让i变成3去检查15%3===0的情况!

简单说,这段代码的逻辑变成了:只要第一个除数(也就是2)不能整除目标数,就直接判定它是质数——这完全不符合质数的定义啊!质数需要确认所有小于它的正整数(除了1)都不能整除它,而不是只检查第一个数。

再看正常工作的代码逻辑

function checkIsPrime(num) {
  if (num === 1) {
    return false
  }
  for(let i = 2; i < num ; i++){
    if (num % i == 0) {
      return false
    }
  }
  return true
}

这段代码的逻辑才是对的:

  1. 先排除1的情况(1不是质数)。
  2. 遍历所有从2到num-1的数,只要找到任何一个能整除num的数,立刻返回false(说明不是质数)。
  3. 如果整个循环跑完了,都没找到能整除的数,那说明这个数确实是质数,这时候才返回true。

还是拿15举例:

  • i=2时,15%2≠0,循环继续;
  • i=3时,15%3===0,立刻返回false,符合预期。

关于你提到的用变量的写法

你说的先设let answer = true,找到能整除的数就改成false,最后返回answer的写法,其实和上面正确代码的逻辑是一致的——它会跑完所有循环检查,不会提前终止。但如果给这个写法加else分支,比如找到不能整除的数就把answer改回true,那同样会出问题:比如15在i=2时把answer改成true,到i=3时改成false,但如果之后还有i的话可能又改回去,结果就错了。

核心总结:质数判断的关键是「排除所有非质数的可能」,只有当所有可能的除数都检查过且都无法整除时,才能确定是质数,绝对不能提前在第一次遇到不能整除的数就返回true

备注:内容来源于stack exchange,提问作者Nick

火山引擎 最新活动