JavaScript质数判断代码else分支异常触发问题咨询
问题原因
你的判断逻辑触发时机写错了,才会导致奇数传入时疯狂打印else分支的结果:
- 质数的判定规则是:从2开始到num的平方根(你原来写遍历到num-1也能用,就是效率低)的所有整数,都没法整除num,才能判定是质数。你现在的写法是只要循环里某一个i没法整除num,就立刻进else打印「这是质数」,根本不等后面的循环跑完。
- 举个例子,你传105的时候,第一个循环i=2,105除以2余1,立刻就进else打了一次质数结果;等i跑到3的时候,105能被3整除,才进非质数分支打日志然后break,所以你会看到输出里先混着一堆质数判定的日志,最后才出非质数的结果。
- 另外你非质数分支的日志写的「devided by zero」是笔误,这里是被i整除,和除以0没关系,除以0会直接报错,走不到这个分支。
- 还有个隐藏问题:你循环里的i没有用let/const声明,会直接变成全局变量,很容易引发其他意料之外的问题。
这是你原来的代码:
var num = parseInt(105); // debugger if (num < 1) { console.log("=> 0 or minus value is not a prime number", num); } else if (num == 2) { console.log("=> 2 is a prime number", num); } else if (num > 2) { // 这里i未声明,会污染全局 for (i = 2; i < num; i++) { if (num % i == 0) { console.log("this is a not prime number as it is devided by zero"); break } else { // 问题核心:单次除不尽就直接判定质数,提前打印结果 console.log("this is a prime number") } } }
修正方案
加一个布尔标记位记录是否找到因数,等整个循环跑完都没找到能整除的数,再判定是质数,同时优化循环边界、补上变量声明:
var num = parseInt(105); if (num < 2) { console.log("=> 小于2的值都不是质数", num); } else { let isPrime = true; // 只需遍历到平方根即可,大幅减少循环次数 for (let i = 2; i <= Math.sqrt(num); i++) { if (num % i === 0) { isPrime = false; console.log(`${num}不是质数,它可以被${i}整除`); break; } } if (isPrime) { console.log(`${num}是质数`); } }
内容的提问来源于stack exchange,提问作者MinhajBoss
相关产品推荐
相关产品推荐

