1

私の目標は、素数ではないすべてのアレイスポットをオフにするか、falseに設定することです。配列はパラメータとして提供されます。

public static boolean[] sieveOfEratosthenes(boolean [] a){

    int increment= 2;

    for(int n = 0; n < 9; n++){
        for(int i = increment; i < a.length; i += increment){
            a[i] = false;
        }
        increment += 1;
    }   
    a[2] = true;
    a[3] = true;
    a[5] = true;
    a[7] = true;
    return a;
}

コードは正常に機能します。使用するよりも効率的な方法があるかどうか疑問に思っています。

a[2] = true;
a[3] = true;
a[5] = true;
a[7] = true;

それらの配列項目をtrueとしてリセットします。

前もって感謝します!

4

1 に答える 1

2

これを行う良い方法は、反復* 2でループを開始することです。したがって、ループは次のようになります。

int increment= 2;

for(int n = 0; n < 9; n++){
    for(int i = increment*2; i < a.length; i += increment){
        a[i] = false;
    }
    increment += 1;
}  

このようにして、最初のものをスキップします。

次に、外側のループを変更して、その素因数が製品を処理したためにすでにfalseになっている値を無視するようにします。これで、ループは次のようになります

int increment= 2;

for(int n = 0; n < 9; n++){
    if(a[increment]) {
      for(int i = increment*2; i < a.length; i += increment){
          a[i] = false;
      }
      increment += 1;
    }
}

3番目に、増分値の配列で任意のサイズの配列ループを処理します

int count = a.length;

for(int increment = 2; increment < count; increment++){
    if(a[increment]) {
      for(int i = increment*2; i < count; i += increment){
          a[i] = false;
      }          
    }
}

この電流ループは、1と0が素数と見なされることを前提としています。したがってa[0] = a[1] = false;、0と1が素数ではないという事実を反映するように設定します。

于 2012-08-31T21:42:51.917 に答える