JAVA Primzahlen berechnen - Verständnisfrage?
Hallo Zusammen,
ich habe einen JAVA Code nach meinem Lerhbuch erstellt der die Primzahlen ausgeben soll. Jedoch verstehe ich die Lösung nicht, bzw. ich wäre nie auf die Idee gekommen das so zu lösen - vielleicht kann einer von euch mir das erklären warum das so gemacht wird.
Aufgabe: Schreibe ein Programm, das alle Primzahlen zwischen 1 und 1000 ausgibt.
for (int zahl = 3; zahl <= 1000; zahl = zahl++) {
for (int teiler = 2; teiler < zahl; teiler++) {
if (zahl % teiler == 0) {
break;
}
if (teiler == zahl - 1) {
System.out.println(zahl + " ist eine Primzahl");
}
}
}
}
Wieso verrechne ich plötzlich die dick markierten Werte miteinander und warum rechne ich in der zweiten if-Abfrage "zahl-1"?
Ich hätte es ganz anders gemacht und verstehe diesen Schritt nicht ganz.
Wäre super wenn mir das jemand für Anfänger erklären könnte.
Danke!
MK1
2 Antworten
in der inneren Schleife läuft der Teiler von 2 bis eins unter der zu prüfenden Zahl hoch. Wenn es einen Teiler findet, breakt es komplett aus der for-Schleife raus
Nur wenn es gar nicht gebreakt hat, ist bei Eintritt in das if der teiler == zahl - 1, sonst wird der if-Teil gar nicht erreicht, demnach macht diese if-Abfrage null Sinn bzw. ist logisch redundant.
zahl = zahl++ ist ebenfalls falsch, richtiger ist nur zahl++. Bei zahl = zahl++ wird die Zahl zwar rechts erhöht, allerdings vor Erhöhung links eingespeichert, so dass die Erhöhung unter den Tisch fällt --> Dauerloop!!!
Und es macht überhaupt keinen Sinn, bei jedem Durchlauf zu prüfen, ob teiler == zahl-1. Das ist nur, weil sich das break sonst nicht auch darauf beziehen könnte
Bei größeren Zahlen sollte man auch vorher noch die Wurzel ziehen und nur bis teiler < Wurzel(Zahl) laufen lassen, bei kleinen Zahlen würde die Wurzelziehung hingegen vergleichsweise zu viel Performance kosten.
//Mein Vorschlag
boolean prim;
for (int zahl = 3; zahl <= 1000; zahl++) {
prim=true;
for (int teiler = 2; teiler < zahl; teiler++)
if (zahl % teiler == 0) {
prim=false;
break;
}
if(prim)System.out.println(zahl + " ist eine Primzahl");
}
Wie ist die Definition von Primzahl? Eine Zahl, die nur durch 1 und sich selbst teilbar ist.
Und nun probiert dieses Programm eben für jede Zahl ganz stupid alle anderen möglichen Teiler durch, von 2 bis zahl-1. Sollte einer davon klappen (also ohne Rest teilen), kann es keine Primzahl sein: daher wird diese Schleife abgebrochen. Wenn diese Schleife aber bis zum Ende gelaufen ist, ohne dass das der Fall war, dann haben wir eine Primzahl.
Ich hätte es ganz anders gemacht
Das kann man auch anders machen, das Programm ist nicht sonderlich schlau - ist keine schlechte Übung, sich verschiedene Ansätze zu überlegen.
Nebenbei muss man Java nicht schreien (es ist keine Abkürzung), und bei dieser Zeile solltest du nochmal genau hinschauen:
for (int zahl = 3; zahl <= 1000; zahl = zahl++) {