-1

配列内の素数を特定しようとしています:

メインメソッドで何が間違っていますか?

何を変更すればよいですか?

アルゴリズムも良いですか?

私を助けてください!私は Java を学び始めたばかりで、本当にもっと多くのことを知りたいと思っています。:D

package prime;

import java.util.Scanner;

public class primeClass {

private static Scanner input;

public static void main(String[] args){
    int[] arr=new int[100];
    int n;
    input=new Scanner(System.in);
    n=input.nextInt();
    for(int i=1;i<=n;i++){
        arr[i]=input.nextInt();
        isPrime(arr[i]);
    }

}
public static void isPrime(int[] arr){
    for(int i=0;i<arr.length;i++)
        if(isPrimeNum(arr[i])){
            System.out.println(arr[i]);
        }
}

public static boolean isPrimeNum(int n){
    int d=0;
    for(int j=1;j<=n;j++)
        if(n%j==0)
            d++;
    if(d==2)
        return true;
    else return false;
}
}
4

5 に答える 5

1

なぜ配列を使用しているのですか?私はそれを持つことに何の意味も見ません。

n%1は常に 0 であるため、番号をスキップできます。また、常に 0 であるため、番号をスキップ0することもできます。nn%n

isPrimeNum は、>=2 かつ < n の一致が見つかるとすぐに true を返すことができます。はるかに短い検索は

これは 2 の後に半分のチェックを行います

if (n % 2 == 0) return false; // check is even
for(int j = 3, m = (int) Math.sqrt(n); j <= m; j += 2) // skip all the even.
    if(n % j == 0)
       return false;
return true;

これをさらに最適化するには、次のようにします。これは、3 の後の 1/3 のチェックを行います。

if (n % 2 == 0 || n % 3 == 0) return false; // check is even + 3x
for(int j = 5, m = (int) Math.sqrt(n); j <= m; j += 6) { // skip even + 3x
    if(n % j == 0)
       return false;
    if(n % (j + 2) == 0)
       return false;
}
return true;
于 2013-11-03T20:34:40.163 に答える
0

他のすべてが問題ないかどうかはわかりませんが、このisPrimeNumように変更します.-

public static boolean isPrimeNum(int n) {
    for(int j = 2; j < n; j++) {
        if(n % j == 0) {
            return false;
        }
    }
    return true;
}

余りを出さずに割り切れるj大なり小なりを見つけたときはいつでも、素数ではないと言えます。1nnn

于 2013-11-03T20:33:57.723 に答える
0

まず、j から n まで数える必要はありません。sqrt(n) に達するまで数えれば十分です。
次に、j を 2 から開始すれば十分です。すべての数は 1 で割り切れる可能性があるため、それを確認しても意味がありません。
第 3 に、n を割り切れる数をすべて数えるのではなく、最初に見つけた数だけを数えることです。
最後になりましたが、2 で n が除算されなかった場合、偶数は除算されないため、それらをスキップできます。(ありがとう@PeterLawrey)

コードは次のようになります。

for (int j = 2; j <= Math.sqrt(n); j+=2) {
    if (n%j) return false;
}
return true;
于 2013-11-03T20:34:51.890 に答える
0

コードに関する私のポイントは次のとおりです。

  • このmainメソッドforでは、インデックス位置 1 でループを開始します。配列の最初のインデックス位置は 0 です。
  • 再びforメイン メソッドのループ:isPrime(arr[i]);メソッドは int ではなく配列を想定しているため、この行はコンパイル エラーを発生させるはずです。
  • タスクを2つに分割しませんか?タスク 1 はユーザー入力を配列に読み込むことで構成され、タスク 2 は素数を決定します。
于 2013-11-03T20:36:10.230 に答える
0

メイン メソッドを次のように変更してみてください。ループの外側に isPrime を使用します。

public static void main(String[] args){
    int[] arr=new int[100];
    int n;
    input=new Scanner(System.in);
    n=input.nextInt();
    for(int i=1;i<=n;i++){
        arr[i]=input.nextInt();
        }
    primeClass.isPrime(arr);
}
于 2013-11-03T20:36:36.927 に答える