Frage

Ich möchte alle Primzahlen zwischen zwei Zahlen drucken. Dies ist mein Code:

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);
        }
    }
}

Wenn es mit 1 bis 10 ausgeführt ist der Ausgang ist:

2
3
5
7
11
13
17
19
23

Warum funktioniert es nicht um 7 zu stoppen?

War es hilfreich?

Lösung

Da Ihr Programm sagt Laufzeiten (1 bis 9) nicht unter 10 statt der Schleife stoppen Sie wollen wahrscheinlich:

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

Sehen Sie den Unterschied? Mit freundlichen beginnt bei 1 und stoppt bei 9 (weniger als 10), wobei bei jeder Iteration eine Reihe zu drucken. Die oben stoppt, wenn die Zahl größer ist als die obere Grenze.

Andere Tipps

Sie haben es auf laufen, wo (i 10 <), nicht zu stoppen, wenn der Wert einer Primzahl größer als 10

Sie sind Inkrementieren i jedes Mal um eins, so ist es von i = 1 bis i läuft los = 10 (9 mal). wenn Sie wollen, dass es früher Satz stoppen i = Zwischen.

Sie zählen i von lowerASInt zu upperAsInt. Sie zählen i von 1 bis 10. Die Anweisung i++ Inkrementen i mit 1 (eins).

So Ihre Schleife lautet: während i als 10 weniger ist, ein erstklassiges und Schritt i mit 1 drucken.

So finden Sie die ersten 9 Ergebnisse erhalten.

Dies funktioniert, wenn Sie JDK8 verwenden

 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);

Bitte verwenden Sie nicht parallel () für den obigen Strom, da sie die Leistung verlangsamen wird. Als Faustregel gilt: Bitte Strom nicht parallelisieren tun, wenn Sie Stream.iterate () oder Stream.limit () in Ihrem Code. Ein einfacher Benchmark in meiner vm zeigt die parallele Version 4-mal langsamer als die iterativen ist

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top