0

何度か試しましたが、それでも ArrayOutOfIndex が表示されます。しかし、メモリを節約したいので使用します

boolean[]isPrime = new boolean [N/2+1];

それ以外の

boolean[]isPrime = new boolean [N+1];

これにより、23行目と47行目のArrayOutOfIndexが得られます

23行目:

    for (int i = 3; i <= N; i=i+2) {
    isPrime[i] = true;
    }

47行目:

  for (int i = 3; i <= N; i=i+2) {
        if (isPrime[i]) primes++;
  ...
   }

Full code:

public class PrimeSieve {
    public static void main(String[] args) { 

        if (args.length < 1) {
            System.out.println("Usage: java PrimeSieve N [-s(ilent)]");
            System.exit(0);
        }

        int N = Integer.parseInt(args[0]);

        // initially assume all odd integers are prime

        boolean[]isPrime = new boolean [N/2+1];

        isPrime[2] = true;

        for (int i = 3; i <= N; i=i+2) {
            isPrime[i] = true;
        }

        int tripCount = 0;

        // mark non-primes <= N using Sieve of Eratosthenes
        for (int i = 3; i * i <= N; i=i+2) {

            // if i is prime, then mark multiples of i as nonprime
        if (isPrime[i]) {
          int j = i * i;
          while (j <= N){
            tripCount++;
            isPrime[j] = false;
            j = j + 2*i;
            }
                        }
                                            }

        System.out.println("Number of times in the inner loop: " + tripCount);

        // count and display primes
        int primes = 0;
        if(N >= 2 ){
            primes = 1;
        }
        for (int i = 3; i <= N; i=i+2) {
            if (isPrime[i]) primes++;
            if (args.length == 2 && args[1].equals("-s"))
                ; // do nothing
            else
                System.out.print(i + " ");
        }
        System.out.println("The number of primes <= " + N + " is " + primes);
    }
}
4

3 に答える 3

1

同じインデックス関数を使用して、配列を保存およびアクセスする必要があります。isPrime[i/2]

于 2012-09-26T20:13:57.470 に答える
1

配列のサイズを から に変更する場合[N+1][N/2+1]for ループの終了条件も更新する必要があります。現在、for ループは まで実行されるため、いつi=N実行しようとしているので、.isPrime[i]i > (N/2+1)ArrayIndexOutOfBoundsException

これを変える:

for (int i = 3; i <= N; i=i+2) 

これに:

for (int i = 3; i <= N/2; i=i+2) 
于 2012-09-26T19:55:56.887 に答える
0

たとえば、N=50isPrime が 26 個の要素しか保持していない場合、3,5..47,49 の要素にアクセスしようとしています (もちろん、これは範囲外です)。

おそらく必要なのは、ループ内i/2で (インデックスとして) を使用することです。そのようにして、3,5..47,49 の数値を繰り返し処理しますが、ベクトルの正しいインデックスを使用します。

于 2012-09-26T20:05:35.420 に答える