Der Code von vorheriger Beitrag ist ein kostenintensiver Code, der "die gesamte Liste durchsucht, teilt und durchsucht", wie von @swordone hervorgehoben. Es stellte sich heraus. Basierend auf dem Hinweis von @swordone habe ich den Code grundlegend korrigiert.
Die Unterschiede zum vorherigen Code sind wie folgt.
PrimeNumberFinder.java
static void printPrimeNumbers2(int maxNumber) {
//Schritt 1: Fügen Sie "Ganzzahl von 2 bis Obergrenze" in die Suchliste ein.
boolean[] targetNumbers = new boolean[maxNumber + 1];
Arrays.fill(targetNumbers, true);
targetNumbers[0] = false;
targetNumbers[1] = false;
//Primzahlliste
List<Integer> primeNumbers = new ArrayList<Integer>();
int sqrt = (int) Math.sqrt(maxNumber);
//Schritt 3: Setzen Sie den Siebvorgang fort, bis der erste Wert in der Suchliste die Quadratwurzel des Arguments erreicht.
for(int i=2; i<=sqrt; i++) {
//Schritt 2: Machen Sie die erste Zahl in der Suchliste zu einer Primzahl und zeigen Sie Vielfache aus der Suchliste an.
//* Zu diesem Zeitpunkt ist die bereits ausgeblendete Nummer (false) ausgeschlossen.
int firstNum = i;
if (targetNumbers[i]) {
for (int j=i*firstNum; j<targetNumbers.length; j+=firstNum) {
targetNumbers[j] = false;
}
}
}
//Schritt 4: Verschieben Sie die in der Suchliste verbleibenden Werte in die Primzahlenliste und beenden Sie den Vorgang.
for (int i=2; i<targetNumbers.length; i++) {
if (targetNumbers[i]) {
primeNumbers.add(i);
}
}
//Anzeige von Primzahlen
System.out.println(primeNumbers.stream().map(pNum -> pNum.toString()).collect(Collectors.joining("\t")));
}
Die Obergrenze ist |
Die Obergrenze ist |
Die Obergrenze ist |
Die Obergrenze ist |
|
---|---|---|---|---|
Letzter Code | 54ms | 55ms | 61ms | 102ms |
Dieser Code | 0ms | 1ms | 1ms | 9ms |
Recommended Posts