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

质数检测程序异常求助:始终返回非质数问题排查

嘿,我来帮你找出代码里的问题,主要有三个关键错误导致程序始终返回“非质数”:

1. 循环内的逻辑被错误覆盖

你在循环里的这段代码逻辑有问题:

if(x % i == 0) { 
    y = true; 
}
y = false; 

不管x%i==0是否成立,每次循环最后都会执行y = false;——也就是说,哪怕找到了能整除x的数,刚把y设为true,立刻又被改成false了。循环结束后y永远是false,这直接干扰了后续的判断逻辑。

2. 条件判断用了赋值而非比较

你写的if (y = true)是赋值操作,不是判断y是否等于true。这行代码会把y强制设为true,然后永远执行大括号里的输出语句,所以不管输入什么数,都会打印“非质数”。正确的写法应该是if (y)或者if (y == true)。

3. 循环范围不符合质数判断逻辑

质数的定义是大于1的自然数,除了1和自身外不能被其他数整除。你的循环从2跑到x,当i等于x的时候,x%i==0必然成立,但这是每个数都满足的,完全没必要判断到x本身。循环只需要跑到i <= x/2或者更高效的i*i <= x(因为如果x有大于平方根的因数,对应的另一个因数肯定小于平方根),就能完成判断。


修复后的完整代码

import java.util.Scanner;

public class PrimeNumber { 
    public static void main(String[] args) { 
        System.out.println("Enter a number"); 
        Scanner sc = new Scanner(System.in); 
        int x = sc.nextInt(); 
        sc.close(); 

        // 先默认不是非质数(即默认是质数),除非找到能整除的数
        boolean isNotPrime = false; 

        // 处理特殊情况:小于2的数不是质数
        if (x <= 1) {
            isNotPrime = true;
        } else {
            // 循环到平方根即可,减少不必要的计算
            for(int i = 2; i*i <= x; i++) { 
                if(x % i == 0) { 
                    isNotPrime = true;
                    break; // 找到因数后直接跳出循环,不用继续判断
                }
            }
        }

        if (isNotPrime) { 
            System.out.print(x + " is not a prime number..."); 
        } else {
            System.out.print(x + " is a prime number!");
        }
    } 
}

我还加了对小于等于1的数的判断(因为质数必须大于1),并且找到因数后立刻跳出循环,提升了程序的运行效率。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.26 08:34:40