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

Java素数判断代码中if与else分支同时执行的原因是什么?

原始代码运行异常的根本原因

你的if-else逻辑本身没有问题,不会出现两个分支同时执行的情况,问题出在循环迭代中isPrime变量的值被后续遍历的i覆盖了,具体拆解如下:

  • 原始prime方法的初始值设为false,每次遍历因子i的时候,都会根据当前i能不能整除num直接给isPrime赋值,完全覆盖了之前的判断结果。
  • 举个例子,判断num=9是不是质数:
    1. 遍历到i=2时,9%2=1不等于0,进入else分支,isPrime被设为true
    2. 遍历到i=3时,9%3=0,进入if分支,isPrime被设为false
    3. 遍历到i=4时,9%4=1不等于0,进入else分支,isPrime又被重新设为true
    4. 后续i=5/6/7/8都不能整除9,isPrime会一直保持true,最后返回true,错误判定9是质数。
  • 你修改后的代码逻辑是正确的:先默认num是质数(isPrime=true),只要遍历到任意一个能整除num的因子,就把isPrime设为false,之后哪怕遍历到其他不能整除的因子,也不会再改回true,最后返回的结果就正确。

可选优化方案

如果想提升判断效率,还可以做两处修改:

  1. 找到能整除的因子后直接用break跳出循环,不需要继续遍历后续的i
  2. 循环终止条件可以从i <= num -1改成i <= Math.sqrt(num),减少遍历次数
    优化后的代码如下:
static boolean prime(long num) {
    if (num <= 1) return false;
    boolean isPrime = true;
    for (int i = 2; i <= Math.sqrt(num); i++) {
        if (num % i == 0) {
            isPrime = false;
            break; // 找到因子直接跳出循环
        }
    }
    return isPrime;
}

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.03 09:15:00