最近,我一直在尝试创建一个打印质数的程序,直到获得用户指定的整数为止,该程序本身包括“ PrimeCheck”类,“ PrimeSieve”类和“ Main”类:
public class PrimeCheck {
boolean result;
public PrimeCheck() {
result = true;
}
public boolean primeCheck (int num) {
int i, num1 = num - 1;
for (i = num1; i > 1; i--) {
if (num % i == 0) {
result = false;
}
}
return result;
}
}
import java.util.ArrayList;
public class PrimeSieve {
public PrimeSieve() {
}
PrimeCheck PCObj = new PrimeCheck();
ArrayList<Integer> primes = new ArrayList<Integer>();
public void primeSieve(int num) {
int[] arr = new int[num];
for (int i = 0; i < num; i++) {
arr[i] = i + 1;
if (PCObj.primeCheck(arr[i]) == true) {
primes.add(arr[i]);
}
}
for (int c = 0; c < primes.size(); c++) {
System.out.print(primes.get(c) + " ");
}
}
}
import java.util.Scanner;
public class PrimeSieveMain {
public static void main(String[] args) {
Scanner input = new Scanner(System.in);
PrimeSieve PSObj = new PrimeSieve();
System.out.println("Prime Sieve");
System.out.print("Limit: ");
int limit = input.nextInt();
PSObj.primeSieve(limit);
}
}
请原谅我的经验不足,但似乎无法在此程序中找到问题所在。
最佳答案
PrimeCheck存在服务器设计问题,首先是您将result
变量设计为成员,并且仅在构造时将其初始化为true,但在primeCheck()中将其更新为false。一旦返回false,它将在所有后续调用中返回false。
也不必将结果设计为成员,因为结果仅与方法primeCheck()有关,因此将其更改为直接返回值,从而消除了成员:
public class PrimeCheck {
public boolean primeCheck (int num) {
for (int i = num - 1; i > 1; i--) {
if (num % i == 0) {
return false;
}
}
return true;
}
}
由于PrimeCheck现在不存在任何状态,因此该方法也可以设为静态,从而使程序中的PrimeCheck实例变得多余。您可以只调用静态方法。
由于有多种设计选择,PrimeCheck的效率也极低-一种是从(num-1)开始测试,但是最常见的除数是最小的数字。因此,从低端开始进行测试并向上进行循环会更加有效。上限(num-1)的选择也很差。 num的最大除数是num的平方根,因此上限应为。
关于java - Prime Sieve只打印1-3的整数,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/31122564/