JAVA Primzahlen berechnen - Verständnisfrage?

2 Antworten

Vom Fragesteller als hilfreich ausgezeichnet

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");
}
Woher ich das weiß:eigene Erfahrung – Hobby und teilweise beruflich

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++) {