质数判断代码仅少数数字生效,多数场景失效求排查
你的质数判断代码问题分析与修复
咱们来一步步拆解你代码里导致大部分场景失效的核心问题,再给出靠谱的修复方案:
问题1:循环条件遗漏了「等于」的情况
你用的是 x < Math.sqrt(first),但正确的循环边界应该是 x <= Math.sqrt(first),或者更稳妥的 x * x <= first(避免浮点数精度误差)。举两个典型错误场景:
- 当数字是2时,
Math.sqrt(2)≈1.414,循环变量x从2开始,2 < 1.414不成立,循环直接跳过,primeFirst保持初始的false,但2明明是质数,直接判断错误; - 当数字是9时,
Math.sqrt(9)=3,x < 3只会让x走到2,9%2≠0,循环结束后primeFirst会被设为true,但9是3的平方,显然不是质数,也会判断错误。
问题2:初始值与循环逻辑的矛盾
你把primeFirst初始设为false,但循环里每次先把它设为true再判断是否整除。这会导致:
- 对于2、3这类会跳过循环的质数,初始的
false会直接返回错误结果; - 逻辑上不够严谨,默认应该假设数字是质数,找到因子再推翻这个假设才合理。
修复后的代码
public class PrimeChecker { public static void main(String[] args) { int first = 6; int second = 7; boolean primeFirst = isPrime(first); boolean primeSecond = isPrime(second); System.out.println(first + " is " + primeFirst); System.out.println(second + " is " + primeSecond); } // 抽离成独立方法,更清晰易维护 private static boolean isPrime(int num) { // 小于2的数都不是质数 if (num <= 1) { return false; } // 2和3是质数,直接返回 if (num == 2 || num == 3) { return true; } // 能被2或3整除的数直接排除,减少循环次数 if (num % 2 == 0 || num % 3 == 0) { return false; } // 优化循环:除了2和3,质数都在6n±1的形式里,步长设为6提升效率 for (int x = 5; x * x <= num; x += 6) { if (num % x == 0 || num % (x + 2) == 0) { return false; } } return true; } }
修复逻辑说明
- 边界处理:先直接判断小于等于1的数不是质数,2和3是质数,避免无效循环;
- 提前过滤:能被2或3整除的数直接返回
false,减少后续循环次数; - 循环优化:利用质数的分布规律(除2、3外,质数都在
6n±1),从5开始每次加6,只检查x和x+2,大幅提升判断效率; - 避免精度问题:用
x*x <= num代替Math.sqrt,彻底规避浮点数精度导致的判断误差。
这样修改后,不管是小数字还是大数字,质数判断都会准确生效啦。
内容的提问来源于stack exchange,提问作者miataaaaaa
相关产品推荐
相关产品推荐

