Primzahltest in Java, Hilfe beim Programmieren für Anfänger

3 Antworten

Du musst eine Schleife machen, die die zu Testende Zahl nacheinander durch alle kleineren Zahlen teilt, aber nicht mit dem / operator, sondern mit dem teilen, das den "Rest" ausgibt. (Ich glaub das ist der Mod (für modulo) Operator.) Wenn es keinen Rest gibt (dieser 0 ist), dann ist die Zahl teilbar und somit keine Primzahl. For (int counter=2; counter++; counter < zahl){

if(zahl % counter==0) then abbruch;

} % ist eine Abkürzung für den modulo Operator.

Zamon  13.06.2013, 18:20

Da das Programm noch ständig ausgeben soll, was es tut, kannst du in die If bedingung noch ein else system.out.println(zahl+' geteilt durch '+counter+' ergibt den rest '+zahl%counter+' und ist somit (bisher) keine Primzahl!');

Das macht dann beim beispiel 121 neun mal mal eine textausgabe (121 mod 2 ergibt den rest 1..., 121 mod 3 ergibt den rest..., 121 mod 4 erginbt...) bis schließlich bei 121 % 11 0 rauskommt und die abbruch-sache passiert. was dann kommt musst du machen :)

Hier noch der Wiki artikel zum thema modulo:

http://de.wikipedia.org/wiki/Modulo#Modulo

1
Neino196 
Fragesteller
 13.06.2013, 18:32

Vielen Dank für die schnelle Antwort. Das bildliche Vorstellen der Syntax wird mir nicht ganz klar, liegt auch daran, dass wir noch nie mit Modulo gearbeitet haben. Falls es dir nichts ausmacht, würdest du mir ungefähr zeigen, wie diese Syntax aufgebaut ist?

0
Zamon  13.06.2013, 18:42
@Neino196

nunja, % ist genauso verwendbar, wie + und -.

int a=4;

int b=6;

int c;

int d;

c=a+b;

d=b%a;

Am ende hat die c variable den wert 10 und d den wert 2. Weil 6/4 =1 rest 2 ergibt, und % aka modulo den Rest als Ergebnis hat.

0

Ein einfaches – wenngleich ineffektives – Verfahren ist, die Zahl durch die Zahlen 2, 3, ... n zu teilen und zu überprüfen, ob dabei der Rest Null ist.

Du musst nur bis zur Zahl (n-1) testen, jede Zahl ist glatt durch sich selbst teilbar, ansonsten steht in dem Zitat schon alles, was du machen musst. Feststellen, ob eine Zahl durch eine andere teilbar ist, kannst du mit dem Modulo-Operator ermitteln http://www.datenschwamm.de/4/java_grundkurs.php?p=modulo#modulo

Juliahn  13.06.2013, 19:26

Es würde schon reichen bis sqrt(n) zu überprüfen, da die Teiler entweder die Wurzel sind bei Quadratzahlen oder sonst mindestens einer darunter und einer darüber liegt

1
ceevee  13.06.2013, 20:01
@Juliahn

Ist richtig, nach der 2 müsste er auch nur ungerade Zahlen testen und wenn modulo bei einem Durchlauf nicht 0 ergibt, dann kann er die Prüfung für diese Zahl abbrechen... von solchen Optimierungen hab ich nur abgesehen, um das für den Fragesteller nicht noch komplizierter zu machen.

0
Franz1957  15.06.2013, 03:38
@ceevee

Er müßte nach der 2 nicht mal alle ungeraden Zahlen testen - alle Primzahlen bis ⌊sqrt(n)⌋, wenn man sie schon kennt, sollten genügen.

0
ceevee  15.06.2013, 12:51
@Franz1957

alle Primzahlen bis ⌊sqrt(n)⌋, wenn man sie schon kennt, sollten genügen.

Die kennt man aber nicht, müsste sie also erst berechnen. Ein Programm, das so rechnet, würde deutlich länger brauchen. Und es ist ja nicht Sinn der Sache, dass der Fragesteller schon eine Liste mit Primzahlen in dem Programm vorgibt.

Ein Eratosthenes- bzw. Atkin-Sieb wäre sogar noch schneller. Das ist hier aber alles nicht die Frage, lasst den Fragesteller doch erstmal einen allgemeinen Primzahltester fertigstellen, danach kann er über Optimierungen nachdenken. ;)

0
public static boolean isPrim(long n) {
    if (n <= 2)
        return true;
    for (long i = 2; i <= n/2; i++)
        if (n % i == 0)
            return false;
    return true;
}

das gilt natürlich nur für n > 0!