Java Eratostenes筛选,只打印出给定天花板上最大的素数?

时间:2013-11-11 07:09:54

标签: java arrays loops sieve

每个人!我有一个java应用程序,显示从2到给定数字(用户输入)的所有素数。如何从给定范围打印出最后一个数字,我的意思是最大数字? 例如:如果用户输入为12,则编译器仅打印11,而不打印2,3,5,7,11。 这是代码:

  package sieve_eratos;

   import java.util.Scanner;

   public class Sieve_Eratos {

public static void main(String[] args) {

    // get the ceiling on our prime numbers
    int N;
    Scanner sc = new Scanner(System.in);
    System.out.print("enter the prime number ceiling: ");
    N = sc.nextInt();
    sc.close();
    int k = 0;
    // init numbers array, where true denotes primality
    boolean[] isPrime = new boolean[N];
    // init possible primes
    isPrime[0] = false; // 1 is not prime
    for (int i = 1; i < N; i++) {
        isPrime[i] = true;
        k = k + 1;

    }


    // check every number >= 2 for primality
    for (int i = 2; i <= N; i++) {

        // i is prime if it hasn't been "crossed off" yet
        if (isPrime[i - 1]) {

            // print out the prime number
            System.out.println(i);



            // "cross off" all the subsequent multiples of i
            //for (int j = 2*i; j <= N; j += i) {
            for (int j = i * i; j <= N; j += i) { // more efficient
                isPrime[j - 1] = false;

            }

        }

    }
}
}

我正在考虑创建另一个整数数组,然后调用最后一个元素(这将是存储的最后一个数字),但我不知道如何做到这一点。 提前谢谢!

3 个答案:

答案 0 :(得分:0)

使用NavigableSet.lower。看一下下面的例子

Integer primeValues[]={2,3,5,7,11};//Here store all primes 
NavigableSet<Integer> primeCollec=new TreeSet<>();
primeCollec.addAll(Arrays.asList(primeValues));
                      //Add all range prime into NavigableSet

int input=12;// Get the user input here
int output=primeCollec.lower(input);// Here is the desired output based on input

System.out.println(output);

答案 1 :(得分:0)

由于数字是连续数字(从1到N),我们可以检查Prime数字标记(在您的代码中,它是 boolean [] isPrime )最大的指数。

如果是,那么它的索引和1(索引+ 1)的总和将是我们想要的上限。

代码如下:

public static int populateCeilingPrime(boolean[] flags)
{
int len = flags.length;
for(int i= len -1;i>=0;i--)
{
    if(flags[i])
    {
        return i+1;
    }
}
return 0;
}

所以你只需要调用上面的方法来填充天花板素数,在main方法的末尾使用以下代码。

System.out.printf("The ceiling prime is %d ", populateCeilingPrime(isPrime));

答案 2 :(得分:0)

您可以检查您要打印的数字是否大于您想要打印的早期数字,而不是打印素数,如果它是素数,则更大,您可以将该素数保存为目前为止的最大值。完成筛选过程后,保存的素数应该是您想要的。

像这样:

int maxPrime = 0;
for (int i = 2; i <= N; i++) {

    // i is prime if it hasn't been "crossed off" yet
    if (isPrime[i - 1]) {
        if(i > maxPrime) {
             maxPrime = i;
        }

        // "cross off" all the subsequent multiples of i
        //for (int j = 2*i; j <= N; j += i) {
        for (int j = i * i; j <= N; j += i) { // more efficient
            isPrime[j - 1] = false;

        }

    }

}
System.out.println(maxPrime);