2017-10-22 46 views
1

0の範囲内のすべての素数を表示する配列を返したいと思います。素数Javaの配列

0から5の範囲の場合、配列は[2,3,5]で返されます。仕事の中で私は教授から、後で0を素数に置き換える前に、配列全体を0で埋めるべきだと言われました。

現在、配列の次の位置にアクセスしていないようですが、配列の最初の位置に常に値を割り当てるように見えるため、私のコードは正しい配列を返しません。 現在の結果配列は[2,3,5]ではなく、[5,0,0,0,0]です。 ご協力いただければ幸いです。

public static int[] generierePrimzahlen(int bis){ 
int [] myAry = new int[bis]; 
Arrays.fill(myAry,0); 
for(int i=0;i<myAry.length;i++){ 
     for (int nextprime=1; nextprime < bis; nextprime++){ 
      int counter = 0; 
     // System.out.println(nextprime); 
      if (istPrimzahl(nextprime)){ 
       myAry[counter] = nextprime; 
       counter++; 
      } 

     } 
    System.out.print(myAry[i]+" "); 
    } 

return myAry; 


} 

PS: Iは、特定の数が素数であるかどうかチェックする機能法(istPrimzahl)を有します。

+2

2つのループを使用することは全く必要ありません。 – user3437460

+0

あなたの先生がEratosthenesのSieveアルゴリズムを実装したかったと思うのですが、多分私は間違っています。 –

答えて

1

問題は、あなたのカウンターが間違っスコープ内にあるということです。 です。最初のforループの繰り返しごとに、新しいカウンタを宣言します。配列に素数を代入するときは0になります。

public static int[] generierePrimzahlen(int bis){ 
int [] myAry = new int[bis]; 
// Arrays.fill(myAry,0); // no need, this is already been done at initialization 
for(int i=0;i<myAry.length;i++){ 
    int counter = 0; 

     // adding <= 'nextprime <= bis;' to check also the last number in the range 
     for (int nextprime=1; nextprime <= bis; nextprime++){ 
     // int counter = 0; wrong scope 
     // System.out.println(nextprime); 
      if (istPrimzahl(nextprime)){ 
       myAry[counter] = nextprime; 
       counter++; 
      } 

    } 
    if(myAry[0] != 0) // to get rid of displaying Zeros 
     System.out.print(myAry[i]+" "); 
    } 

return myAry; 


} 
+0

ああ、ありがとう。それは役に立ちました。私はまだカウンターのループに問題があります。しかし、それは今とてもうまく動作します:) – Belladurmiente

+0

あなたは答えを受け入れることができます: – inxoy

+0

ああ、ごめんなさい。私はここで新しく、私はそれをしなければならないことを知らなかった。しかし、ボックスをチェックすると、そのトリックが完了しているはずです。申し訳ありません – Belladurmiente

0

ArrayListは配列よりも優れた選択肢になります。しかし、配列を使用することが別の学校の要件である場合、あなたがしたこと:

int[] myAry = new int[size]; 

はすでにすべての要素をゼロに設定します。

これに2つのループを使用する必要もありません。ただ:1からnまで

  • から貫通

    • ループ現在の数が素数である場合、現在のインデックスの配列
    • IDX ++

    に設定し、私は次のにアクセスしていないようです配列内の最初の位置に常に値を割り当てているようです。

    これは、反復ごとにカウンタ変数をゼロに戻しているためです。ループの外側に宣言する必要があります。

    例:

    int idx = 0; //place this outside the loop 
    for(int i=1; i<=n; i++) 
        if(isPrime(i)) 
         myAry[idx++] = i; 
    
  • 0

    以下の行を両方のforループの外側に置きます。それは動作します。 問題の原因は、forループを入力中にカウンタをリセットすることです。

    int counter = 0; 
    
    +0

    偉大な、あなたの返事をありがとう。それは私の問題だった:) – Belladurmiente