質問

私は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で停止しないのですか?

役に立ちましたか?

解決

あなたのプログラムが実行回数(1〜9)が代わりにあなたのループの10の下に停止しないと言うので、おそらく欲しいます:

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

の違いを参照してください?あなたは1から始まり、各反復に番号を印刷し、9(10未満)で停止します。数が上限よりも大きい場合、上記停止します。

他のヒント

あなたはそれを実行するように設定されている場所(私は10を<)プライムの値が10より大きい場合、停止しない。

実行に起こっているように、

あなたは、1ずつIをインクリメントしているから、I = 1までI = 10(9回)。あなたはそれが以前のセットを停止したい場合は、I =中間ます。

あなたはilowerASIntからupperAsIntを数えています。あなたは1から10まで私を数えています。 文i++は、1(1)でiをインクリメント。

だからあなたのループは、読み取ります。 iが10未満であるが、1でプライムし、インクリメントiを印刷します。

だから、最初の9件の結果が得られます。

あなたが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);
それはパフォーマンスが低下しますと、

、上記のストリームのための並列()を使用しないでください。あなたはStream.iterate()またはStream.limitを(持っている場合は親指のルールとして、あなたのコード内で)ストリームを並列化しないでください。私のVMでの簡単なベンチマークは、パラレルバージョンは、反復1より4倍遅い示しています。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top