Prime Sieve仅打印整数1-3

时间:2015-06-29 18:05:08

标签: java primes

最近,我一直在尝试创建一个打印素数的程序,直到达到用户指定的整数,程序本身包括“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);
    }
}

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

3 个答案:

答案 0 :(得分:2)

您的问题出在PrimeCheck课程中。该类有一个名为result状态变量(一个字段)。只要对象是“活着的”,状态变量就会保留调用之间的值。

因此,只要您点击的数字不是prime,就可以将此result设置为false。该值保持不变,并且永远不会改变。

result变量应该是本地变量,而不是状态变量,并且应该在方法开头设置为true。这样每次都会重新开始。

其他说明:

  • PrimeCheck课程中没有任何意义。它不代表真正的“实体”,并且可以轻松地将该方法添加到PrimeSieve类中。为不同的实体创建类是一个很好的做法,但我认为在这种情况下没有意义 - 它只有一个函数,并且该函数不依赖于任何东西,而是依赖于它的参数。
  • 如果您打算代表Sieve of Eratosthenes,那么这不是正确的算法。这是一个天真的算法 - 它只是单独测试每个数字,而不是像真正的Sieve那样交叉掉以前的素数的倍数。

答案 1 :(得分:1)

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的平方根,所以上限应该是。

答案 2 :(得分:0)

当你得到这个数字不是素数时:

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

在你开始确定素数之前,你应该假设它是素数 没有经过测试,只是一个想法