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

Java质数判断代码问题求助:合数输出无限循环且结果错误

Java质数判断代码问题求助:合数输出无限循环且结果错误

兄弟别慌!刚学Java一周就能自己写判断程序已经很棒了,咱来一步步揪出问题根源~

你的代码核心问题分析

先看你这段代码的bug点:

  1. 无限循环打印Composite:当找到合数的一个因数(比如输入4,d=2时4%2==0),你只打印了Composite,但没让循环终止,也没给d自增,所以d一直是2,循环条件d < n永远成立,就会无限输出Composite。
  2. 加break后仍会打印Prime:如果你在System.out.println("Composite");后面加break,确实能终止循环,但循环结束后外面的System.out.println("Prime");还是会执行,导致合数会先输出Composite再输出Prime,结果依然错误。

修正后的代码方案

我们可以用一个布尔变量标记是否为质数,找到因数后立刻标记并跳出循环,最后根据标记输出结果:

import java.util.*;
class PrimeNumber {
    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        int n = sc.nextInt();
        // 先默认是质数
        boolean isPrime = true;
        // 优化:其实只需要循环到sqrt(n)就够了,不用到n,效率更高
        int d = 2;
        while(d <= Math.sqrt(n)) {
            if(n % d == 0) {
                // 找到因数,说明是合数
                System.out.println("Composite");
                isPrime = false;
                // 找到一个因数就够了,直接跳出循环
                break;
            } else {
                d++;
            }
        }
        // 循环结束后,如果还是true,说明没找到因数,是质数
        if(isPrime) {
            // 注意:还要排除n=1的情况,1既不是质数也不是合数
            if(n == 1) {
                System.out.println("Neither prime nor composite");
            } else {
                System.out.println("Prime");
            }
        }
        sc.close(); // 别忘了关闭Scanner,养成好习惯
    }
}

额外优化点

  • 循环到Math.sqrt(n)就够了:因为如果n有一个大于sqrt(n)的因数,那必然对应一个小于sqrt(n)的因数,这样能减少循环次数,提升效率。
  • 处理n=1的特殊情况:1既不是质数也不是合数,你的原代码没考虑这个,加上更严谨。

再给你捋一遍逻辑

  1. 初始化isPrime为true,假设输入的数是质数。
  2. 从2开始遍历到sqrt(n),检查是否能整除n。
  3. 一旦找到能整除的数,立刻打印Composite,标记isPrime为false,跳出循环(不用再找其他因数了)。
  4. 循环结束后,如果isPrime还是true,再判断n是不是1,最后输出Prime或者特殊情况的提示。

这样就解决了无限循环和重复输出的问题啦,刚学编程遇到这种逻辑问题很正常,多debug几次就有感觉了😉

备注:内容来源于stack exchange,提问作者Mohd. Saad Haider

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.04.16 12:40:29