Prime Sieve 仅打印整数 1-3

Prime Sieve only prints integers 1-3

最近,我一直在尝试创建一个程序来打印素数,直到达到用户指定的整数,该程序本身包括一个 "PrimeCheck" class、一个 "PrimeSieve" class 之类的,还有 "Main" class:

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);
    }
}

请原谅我的经验不足,但我似乎无法在这个程序中找到问题。

当你得到的数不是质数时:

public boolean primeCheck (int num) {
    int i, num1 = num - 1;
    for (i = num1; i > 1; i--) {
        if (num % i == 0) {
            result = false;
        }
    }
    return result;
}

结果变成假的,永远不会改变,所以我建议:

public boolean primeCheck (int num) {
    result=true;
    int i, num1 = num - 1;
    for (i = num1; i > 1; i--) {
        if (num % i == 0) {
            result = false;
        }
    }
    return result;
}

在你开始判断素数之前,你应该假设它是一个素数
未经测试,只是一个想法

PrimeCheck 有几个设计问题,首先是您将 result 变量设计为成员,并且它在构造时仅初始化为 true,但在 primeCheck() 中更新为 false。一旦它 return 为 false,它将在 所有后续调用 .

上 return false

也没有必要把result设计成成员,因为result只和方法primeCheck()有关,所以直接改成return的值,去掉成员:

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 的平方根,因此上限应该是那个。

您的问题在 PrimeCheck class。 class 有一个名为 result 状态变量 (一个字段)。只要对象是 "alive".

,状态变量就会保留调用之间的值

因此,只要您输入的数字不是 prime,就可以将此 result 设置为 false。该值将保留且永远不会更改。

result变量应该是局部变量,不是状态变量,在方法的开头应该设置为true .这样每次都会重新开始。

其他说明:

  • PrimeCheckclass真的没有意义。它并不代表真正的"entity",并且该方法可以很容易地添加到PrimeSieve class。为不同的实体创建 classes 是一个很好的做法,但我认为在这种情况下没有意义 - 它只有一个功能并且该功能不依赖于它的参数。
  • 如果您打算表示 Sieve of Eratosthenes 那么这不是正确的算法。这是一种朴素的算法——它只是单独测试每个数字,并没有像真正的 Sieve 那样删除之前素数的倍数。