Java: Primzahlen Programm?


18.07.2022, 13:34

Screenshot

Skohsl  18.07.2022, 13:37

Okay, jetzt hast du deinen Code hinzugefügt (zwar als Bild, aber immerhin). Trotzdem: Was genau ist deine Frage?

verreisterNutzer 
Fragesteller
 18.07.2022, 13:38

Ursprünglich wollte ich nach Denkstößen fragen aber ich habe schon begonnen und es funktioniert nicht.

Skohsl  18.07.2022, 13:43
es funktioniert nicht.

Das ist weder eine Frage, noch eine Fehlerbeschreibung...

Also zum dritten mal: Was genau ist deine Frage?

verreisterNutzer 
Fragesteller
 18.07.2022, 13:48

ich habe oben genau beschrieben was die Aufgabenstellung ist und gesagt ,dass das jetzige Programm, so wie im Screenshot, nicht funktioniert.

Skohsl  18.07.2022, 13:51

Und du hast immer noch nicht begriffen, dass "es funktioniert nicht" keine Fehlerbeschreibung ist...

WAS genau funktioniert nicht?

WIE genau äußert sich das Problem?

verreisterNutzer 
Fragesteller
 18.07.2022, 13:59

Egal welche Zahl ich eingebe, es wird immer als Primzahl angegeben. Dazu funktioniert meine Schleife und die IF Abfrage nicht

7 Antworten

Die Schleife sollte erst mit i = 2 beginnen, denn durch 1 sind alle Zahlen teilbar.

Der Test n % n == 0 ist überflüssig, den n ist immer durch sich selbst teilbar. (außer für n == 0)

Es genügt, die Schleife nur bis zur Wurzel aus n laufen zu lassen.

Das break gehört nicht in den if-Zweig, denn um eine Primzahl zu erkennen, muss man alle i testen.

Insgesamt ist die Ausgabe innerhalb der Schleife unglücklich. Man sollte sich in einer boolsche Variablen merken, ob man einen Teiler gefunden hat und das Ergebnis zum Schluss ausgeben.

i von 1 laufen zu lassen ergibt keinen Sinn, denn jede Zahl ist durch 1 teilbar.
Bis n brauchst du i nicht laufen lassen, weil ab n/2 kann keine Zahl erscheinen, die n teilt, weil n durch eine Zahl größer als n/2 eine Zahl ergibt, die kleiner als 2 ist. 2 ist aber die kleinste Primzahl.

0 ≡ n mod n gilt auch immer. Somit gehst du immer gleich ins if und meinst, deine Primzahl gefunden zu haben. Jedoch ist zum Beispiel 0 ≡ 4 mod 1 und 0 ≡ 4 mod 4, aber 4 ist keine Primzahl.

Du musst break anweisen, wenn du herausgefunden hast, dass es eine Zahl außer 1 und n gibt, durch die restlos geteilt werden kann.

Woher ich das weiß:Berufserfahrung – Programmierer

Dass deine Schleife über i nicht mit 1 beginnen sollte, weil jede Zahl durch 1 teilbar ist, haben bereits andere bemerkt.

Die Logik im Schleifeninneren funktioniert nicht:

if (n%i==0) {
  System.out.println(n + " ist eine Primzahl");
  break;
} else {
  System.out.println(n + " ist keine Primzahl");
}

würde bei jedem Teilerkandidaten i eine Ausgabe machen. Geht es einmal glatt auf, kommt "n ist eine Primzahl" und es folgen keine weiteren Tests. Hast du 1000 Teiler probiert, ohne einen gefunden zu haben, hast du 1000 mal "ist keine Primzahl" auf dem Bildschirm stehen.

Wenn du einen Teiler gefunden hast, solltest du die richtige Ausgabe ("KEINE Primzahl") machen und andernfalls gar nichts (kein Else-Zweig). Wenn du die Schleife bis zum Ende durchlaufen hast, ohne einen Teiler gefunden zu haben, gibst du "EINE Primzahl" aus.

Man kann i bis n einschließlich laufen lassen, macht dann aber unnötig viele Tests. Für den Hausgebrauch geht das aber. Für richtig große Primzahlen gibt es bessere Tests als "Ausprobieren".

n % i ergibt für i==n immer 0. Das kann man als Prüfkriterium nehmen, ob man einen echten Teiler gefunden hat.

1) Schau dir an, was du überhaupt in deinem if überprüfst. Dass sich n durch n restlos teilen lässt, ist z.B. nicht sonderlich interessant...

2) Überleg dir, ob die Schleife so korrekt ist. Willst du wirklich bei 1 beginnen? Musst du wirklich bis n rauf?

3) Überleg dir, was hier überhaupt innerhalb und außerhalb der Schleife sein sollte.

In anderen Worten: erst die Logik entwickeln, dann Code schreiben. Zumindest, bis du mehr Übung hast.

Da gibt es verschiedenste Möglichkeiten, viele nicht sonderlich effizient.

Les dich am besten im Wikipediaartikel dazu schlau:

https://de.wikipedia.org/wiki/Primzahltest

Schachpapa  18.07.2022, 14:54

Ich glaube, bei dieser typischen Aufgabe für Programmieranfänger steht die Effizienz nicht an wichtigster Stelle. Man soll das Verfahren, das man sonst zu Fuß macht (Ausprobieren) systematisieren und als Programm schreiben.

Wenn man das zum Laufen gekriegt hat (für manche schon schwer genug) kann man sich überlegen, dass man nicht alle Zahlen bis n probieren muss und dass man z.B. nur ungerade Faktoren haben kann, wenn die zu prüfende Zahl ungerade ist.

Hast du das in deiner Ausbildung nicht machen müssen?

1
Destranix  18.07.2022, 15:57
@Schachpapa
Ich glaube, bei dieser typischen Aufgabe für Programmieranfänger steht die Effizienz nicht an wichtigster Stelle.

Ich weiß ;-)

Hast du das in deiner Ausbildung nicht machen müssen?

Doch! Und ich fand es blöd, dass das so ineffizient ist. Dass das in besserer Laufzeit geht hat man mir erst Jahre später gesagt. (Ich glaube aber das wusste man davor auch nicht unbedingt, Primzahlen sind iirc erst seit kurzem sicher in P.)

0