Java质数判断代码问题求助:合数输出无限循环且结果错误
Java质数判断代码问题求助:合数输出无限循环且结果错误
兄弟别慌!刚学Java一周就能自己写判断程序已经很棒了,咱来一步步揪出问题根源~
你的代码核心问题分析
先看你这段代码的bug点:
- 无限循环打印Composite:当找到合数的一个因数(比如输入4,d=2时4%2==0),你只打印了Composite,但没让循环终止,也没给d自增,所以d一直是2,循环条件
d < n永远成立,就会无限输出Composite。 - 加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既不是质数也不是合数,你的原代码没考虑这个,加上更严谨。
再给你捋一遍逻辑
- 初始化
isPrime为true,假设输入的数是质数。 - 从2开始遍历到sqrt(n),检查是否能整除n。
- 一旦找到能整除的数,立刻打印Composite,标记
isPrime为false,跳出循环(不用再找其他因数了)。 - 循环结束后,如果
isPrime还是true,再判断n是不是1,最后输出Prime或者特殊情况的提示。
这样就解决了无限循环和重复输出的问题啦,刚学编程遇到这种逻辑问题很正常,多debug几次就有感觉了😉
备注:内容来源于stack exchange,提问作者Mohd. Saad Haider
相关产品推荐
相关产品推荐

