0

入力範囲内のすべての素数を見つけることができるようになりましたが、最小の素数である 2 を見つけることができません。

for(int number=2;number<range;number++){
    for(int testDivide=2;testDivide<Math.sqrt(number);testDivide++){
        if(number%testDivide!=0) {
            System.out.println(number);
        }
        break;

    }

範囲 10 の場合、5 7 9 が表示されますが、2 は表示されません。

4

6 に答える 6

0

素数のリストを生成する最良の方法の 1 つは、" Sieve of Erwhatshisface "であることに注意してください。

検索したい最大数まで、2 から始まる連続した整数のリストを作成します。リスト (2) のゼロ以外の最初の数値を取得し、その場所から手順 2 を繰り返し、2 つおきのリスト要素をゼロにします。

次に、ゼロ以外の 2 番目の数 (3) を取り、その位置からステップ 3 を繰り返してゼロにします。リスト内のゼロ以外の値をすべて処理するまで (または、少なくとも途中で、リストの末尾を超えるまで) 処理を続けます。

残りのゼロ以外の数はすべて素数です。

于 2013-10-09T02:28:58.023 に答える
0

コメントに収まらないため、ここにコードを再投稿します。

public static void main(String[] args) {
        int cnt = 0;

        for (int i = 2;; i++) {
            if(i==2){
                System.out.println(i);
                continue;
            }
            if (Priem(i)) {
                cnt++;
                System.out.println(i);
                if (cnt == 200)
                    break;
            }
        }

    }

    public static boolean Priem(int n) {
        for (int i = 2; i <Math.sqrt(n)+1; i++) {
            if (n % i == 0) {
                return false;
            }
        }
        return true;
    }
于 2013-10-09T02:55:47.133 に答える
0

for ループが少し混乱していると思います。

for(int testDivide=2;testDivide<Math.sqrt(number);testDivide++){

}

testDivide が sqrt(number) と等しいときに停止する理由がわからない場合は、testDivide がより大きいときに停止する必要があります。

また、内側の for ループの内側も正しくありません。

    if(number%testDivide!=0) {
        System.out.println(number);
    }
    break;

基本的にこれが行うことは、数値が 2 で割り切れるかどうかを確認してからブレークすることだけです。きれいに割り切れる数 (number%testDivide==0) を見つけた場合にのみ、中断する必要があります。おそらく、ブレーク時にtrueに設定したブール値を保持し、そのブール値がfalseの場合、内側のforループが終了した後にのみ出力します。

線に沿った何か:

    for (int number=2; number<range; number++){
        boolean found = false;
        int limit = (int)Math.sqrt(number);
        for (int testDivide=2; testDivide<=limit; testDivide++){
            if(number%testDivide==0) {
                found = true;
                break;
            }
        }   
        if (!found) System.out.println(number);
    }
于 2013-10-09T02:19:29.907 に答える
0

あなたのコードでは、数値が 2 の場合sqrt(2)は 1.41 であり、制御はループに入りません。まで繰り返すロジックがわかりませんでしたsqrt(number)。このコードを試してください

public class Test {
public static void main(String[] args) {
    int range = 500; //I assume
    for (int i = 2; i< range; i++) {
        if (isPrime(i)) {
            System.out.println(i);
        }
    }

}

public static boolean isPrime(int number) {
    for (int i = 2; i <= number/2; i++) {
        if (number % i == 0) {
            return false;
        }
        if(i % 2 == 1) {
            i++;  //If not divided by 2 then
                  // need not to check for any even number
                  // Essentially incrementing i twice hereafter
        }
    }
    return true;
  }
}
于 2013-10-09T02:21:28.153 に答える