请求协助:Java指定区间素数打印程序问题排查
嘿,我帮你排查下这段素数程序的问题哈~先看看你代码里的几个关键错误:
- 内层循环范围完全错了:判断一个数
i是不是素数,根本不需要循环到end,只需要检查到i的平方根(或者i/2)就行,循环到end纯属做无用功,还会搞乱判断逻辑。 - 素数判断逻辑搞反了:你现在的逻辑是「只要
i%j!=0就把i加到结果里」,但素数的定义是除了1和自己,没有其他因数——正确的逻辑应该是:如果存在任何一个j(2<=j<=sqrt(i))能整除i,那这个数就不是素数;只有当所有j都不能整除i时,它才是素数。而且你每次直接赋值res = i + " ",会把之前的结果全覆盖,最后只会留下最后一次循环的数,根本收集不到所有素数。 - 没处理边界情况:比如如果传入的
beg是1,1不是素数,但你的代码会把它纳入循环;还有像2这种最小的素数,你的内层循环会错误地去判断,导致它被漏掉。 - 字符串拼接效率低还容易出错:直接用
res = i + " "会覆盖之前的内容,应该用追加的方式,而且用StringBuilder比直接拼接字符串高效多了。
给你改好的代码,应该能满足你的需求:
package com.robin.practise; import java.util.Scanner; public class PrimebetweenRange { private static String Prime(int beg, int end) { StringBuilder res = new StringBuilder(); // 素数从2开始,所以起始点取beg和2的最大值 int start = Math.max(beg, 2); for (int i = start; i <= end; i++) { boolean isPrime = true; // 循环到i的平方根,减少计算量 for (int j = 2; j <= Math.sqrt(i); j++) { if (i % j == 0) { isPrime = false; break; // 找到因数直接跳出,不用继续判断 } } if (isPrime) { res.append(i).append(" "); } } // 去掉末尾多余的空格,返回干净的结果 return res.length() > 0 ? res.substring(0, res.length() - 1) : ""; } public static void main(String[] args) { Scanner scn = new Scanner(System.in); System.out.println("Enter any two numbers: "); int n1 = scn.nextInt(); int n2 = scn.nextInt(); scn.close(); System.out.println(Prime(n1, n2)); } }
给你解释下改了啥:
- 用
StringBuilder来拼接结果,避免字符串拼接的性能问题,也不会覆盖之前的内容。 - 把循环起始点设为
Math.max(beg, 2),直接跳过小于2的非素数。 - 内层循环优化到
Math.sqrt(i),大大减少计算次数,提升效率。 - 用
isPrime布尔变量来标记当前数是否为素数,找到因数就立刻跳出循环,避免无用计算。 - 最后处理结果字符串,去掉末尾多余的空格,返回的结果更规范。
测试一下你的例子:Prime(4,7)会返回5 7,Prime(7,16)会返回7 11 13,完全符合需求哦~
内容的提问来源于stack exchange,提问作者Rabindra Kumar Mahato
相关产品推荐
相关产品推荐

