0

2つの数の間のすべての素数を印刷したい。これは私のコードです:

package sphere;

import java.math.BigInteger;
import java.io.*;

class PrimeTest2 {
    public static void main(String args[]) throws java.lang.Exception {
        BufferedReader r = new BufferedReader(new InputStreamReader(System.in));
        String s = r.readLine();
        String [] splitted = s.split(" ");
        BigInteger lower = new BigInteger(splitted[0]);
        BigInteger upper = new BigInteger(splitted[1]);
        int lowerAsInt = Integer.parseInt(splitted[0]);
        int upperAsInt = Integer.parseInt(splitted[1]);
        BigInteger intermediate = lower;

        for (int i=lowerAsInt; i<upperAsInt; i++) {    
            intermediate = intermediate.nextProbablePrime();
            System.out.println(intermediate);
        }
    }
}

1 10で実行すると、出力は次のようになります。

2
3
5
7
11
13
17
19
23

なぜ7時に止まらないのですか?

4

5 に答える 5

5

あなたのプログラムは、実行時間 (1 から 9) が 10 未満で止まらないと言っているためです。ループの代わりに、おそらく次のことが必要です。

BigIntegerupper = BigInteger.valueOf(upperAsInt);
while (intermediate.compareTo(upper) <= 0) {
  System.out.println(intermediate);
  intermediate = intermediate.nextProbablePrime();
}

違いを見ます?あなたのものは 1 から始まり、9 (10 未満) で停止し、反復ごとに数字を出力します。上記は、数値が上限を超えると停止します。

于 2009-07-03T23:36:17.500 に答える
1

素数の値が 10 より大きいときに停止しないように、(i<10) の場所で実行するように設定しています。

于 2009-07-03T23:36:31.930 に答える
0

iからlowerASIntまで数えていupperAsIntます。i を 1 から 10 まで数えています。ステートメントは 1i++ずつ増えますi

したがって、ループは次のようになります。whileiが 10 未満の場合、素数を出力iし、1 をインクリメントします。

したがって、最初の 9 つの結果が得られます。

于 2009-07-03T23:36:29.527 に答える
0

毎回 i を 1 ずつ増やしているため、i=1 から i=10 まで (9 回) 実行されます。早く停止させたい場合は、i = 中間に設定します。

于 2009-07-03T23:37:38.323 に答える
0

これは、JDK8 を使用している場合に機能します

 BigInteger lower=BigInteger.valueOf(1);
        BigInteger high=BigInteger.valueOf(100);
        Stream.iterate(lower, BigInteger::nextProbablePrime).limit(high.longValueExact())
                .filter(p -> p.compareTo(high) <= 0).forEach(System.out::println);

パフォーマンスが低下するため、上記のストリームに parallel() を使用しないでください。経験則として、コードに Stream.iterate() または Stream.limit() がある場合は、ストリームを並列化しないでください。私の vm の単純なベンチマークは、並列バージョンが反復バージョンよりも 4 倍遅いことを示しています

于 2018-06-02T11:08:10.963 に答える