最近,我一直在尝试创建一个打印质数的程序,直到获得用户指定的整数为止,该程序本身包括“ 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/

10-10 16:31