You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

质数判断代码仅少数数字生效,多数场景失效求排查

你的质数判断代码问题分析与修复

咱们来一步步拆解你代码里导致大部分场景失效的核心问题,再给出靠谱的修复方案:

问题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. 边界处理:先直接判断小于等于1的数不是质数,2和3是质数,避免无效循环;
  2. 提前过滤:能被2或3整除的数直接返回false,减少后续循环次数;
  3. 循环优化:利用质数的分布规律(除2、3外,质数都在6n±1),从5开始每次加6,只检查x和x+2,大幅提升判断效率;
  4. 避免精度问题:用x*x <= num代替Math.sqrt,彻底规避浮点数精度导致的判断误差。

这样修改后,不管是小数字还是大数字,质数判断都会准确生效啦。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.15 03:54:17