Java: Ich will mir alle Primzahlen bis 100 ausgeben, jedoch gibt mir das Programm nur die Zahlen bis 100 aus. Wo liegt das Problem?

4 Antworten

Wenn du den falschen Vergleich, den regex9 schon erwähnt hat, korrigiert hast, erhältst du vermutlich überhaupt keine Zahlen mehr.

Denn deine innere Schleife läuft ab 1. Das heißt, beim ersten Durchlauf prüfst du, ob deine Zahl durch 1 teilbar ist. Das ist immer der Fall.
Die Schleife braucht übrigens auch nicht bis pri1 zu laufen, sondern nur bis zur Quadratwurzel von pri1.

Und dann hast du noch das Problem, dass die Variable ip, wenn sie einmal auf false gesetzt wurde, nie wieder true wird ...

Generelles

Zunächst ein paar grundsätzliche Auffälligkeiten:

  • Klassen sollten gemäß der Java Conventions mit einem Großbuchstaben beginnen
  • Du kannst Variablen direkt in der for-Schleife deklarieren
  • Vergleiche werden mit zwei Gleichheitszeichen ausgeführt
  • Du benötigst nicht den Datentyp long, wenn du nur einen Bereich bis 100 brauchst
Das Problem

Dein Code ergibt semantisch (von der Logik her) keinen Sinn. pri2 wird auf 1 gesetzt, was immer kleiner als pri1 ist, weil pri1 mindestens 2 ist. Nun überprüfst du in der Schleife den Rest, doch der Rest von irgendeiner Zahl durch 1 ist immer 0. Daher wird die Schleife sofort verlassen und ist somit redundant. Wenn du sie weglässt, gibt es überhaupt keinen Unterschied. Dein Code lautet stark vereinfacht somit:

for (int i = 2; i < 100; ++i) {
  System.out.println(i);
}

Hieran siehst du sofort, dass dein Code nicht überprüft, ob es sich um eine Primzahl handelt oder nicht.

Lösungsansatz

Das Grundgerüst hast du quasi selbst schon geschrieben:

for (int i = 2; i < 100; ++i) {
  if (isPrime(i)) {
    System.out.println(i);
  }
}

Nun musst du nur noch eine Methode isPrime implementieren, welche true zurückgibt, wenn es sich bei der als Ganzzahl übergebenen Zahl um eine Primzahl handelt. Überlege dir dazu, wie eine Primzahl überhaupt definiert ist:

Eine Primzahl ist nur durch sich selbst und durch 1 teilbar.

Wie kannst du dies überprüfen? Überlege dir eine generelle Vorgehensweise. Was müsste dein Programm tun, um zu überprüfen, ob es sich um eine Primzahl handelt? Wie würdest du als Mensch vorgehen, um eine Primzahl von einer Zahl zu unterscheiden, die keine Primzahl ist? Bevor du irgendeinen Code eingibst, solltest du dir überlegen, wie man dies umsetzen könnte.

Versuche möglichst, dies selbst zu lösen. Sollte dir das nicht gelingen, ist das nicht schlimm. Schau dir meine Lösung an und versuche sie nachzuvollziehen.

Mögliche Lösung
public static boolean isPrime(int n) {
  for (int i = 2; i <= n / 2; ++i) {
    if ((n % i) == 0) {
      return false;
    }
  }

  return true;
}

Das funktioniert, ist aber noch nicht sonderlich effizient. Vielleicht hast du Ideen, wie man diesen Algorithmus verbessern könnte.

Hallo keinplanmehr00,

Du hast leider das Bild vergessen. Code am besten per pastebin.com oder zumindest als Text hier. Gibt dafür das Quelltext-Tag.

Wenn Du alle Zahlen bis 100 siehst, dann gibst Du wahrscheinlich deine Schleifenvariable direkt aus. Du musst aber prüfen ob diese prim ist und nur in dem Fall eine Ausgabe machen.

for (int i=2; i<=100; i++) {
   if (isPrime(i)) {
      System.out.println(i+" ist eine Primzahl"); 
   }
}

isPrime ist dabei eine Methode die prüft, ob die übergebene Zahl eine Primzahl ist. Falls dem so ist wird true zurückgegeben, andernfalls false.

Gruß

Woher ich das weiß:Berufserfahrung

1) Dies ist kein Vergleich, sondern eine Zuweisung:

if (ip=true) {

Das heißt, die Variable wird erst auf den Wert true gesetzt und dieses Ergebnis dann geprüft. Es ist immer wahr.

2) Prüfe nochmals deine Logik generell. Schreibe dir auf einen Zettel (weitab vom Computer), wie du Primzahlen berechnest und löse diese Rechnung dann in einzelne Schritte auf (addiere mit diesem, subtrahiere mit jenem, oder wie auch immer). Löse dich dabei auch von der Programmiersprache.