0

みんな!私は、2 から指定された数値 (ユーザー入力) までのすべての素数を表示する Java アプリを持っています。指定された範囲から最後の数値、つまり最大の数値だけを出力するにはどうすればよいですか? たとえば、ユーザー入力が 12 の場合、コンパイラは 2、3、5、7、11 ではなく、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;

            }

        }

    }
}
}

別の整数配列を作成してから最後の要素(最後に保存された数値になる)を呼び出すことを考えていましたが、これを行う方法がわかりません。前もって感謝します!

4

3 に答える 3

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);
于 2013-11-11T08:17:09.520 に答える
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);
于 2013-11-11T07:21:52.867 に答える
0

数字は連続した数字(1 から N) であるため、 最大のインデックスから素数フラグ (コードでは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));
于 2013-11-11T07:30:34.967 に答える