Primzahl bis n

ocsme

Top Contributor
Ich hab 2 kleine Fragen.
Würde sehr gerne diesen Code aufbessern.
Java:
int n = 20;
        boolean prim;
       
        for(int i=2; i<=n;i++)
        {
            prim = true;
            for(int teiler=2;prim&&teiler<i;teiler++)
            {
                if(i%teiler==0)
                    prim=false;
            }
            if(prim)
                System.out.println(i);

Das ganze läuft! Doch ich würde sehr gerne nicht immer durch die 2 Schleife laufen müssen. Deswegen würde ich sehr gerne die ersten Primzahlen zwischen speichern und dann gegen die Zahl i prüfen. Die Zahl i läuft gegen unser n. Damit wären "unnötige" Abfragen wie die vielfachen von 2,3,5,etc. <- Primzahlen weg =)
Geht das nur mit Kontrollstrukturen oder nur mit einem Array? So weit sind wir nicht :D

und zweitens wieso kann man denn sqrt(n) nehmen? in meinem Fall bei n=20 kommt bei sqrt(n) = 4 raus somit hätte ich ja nur 2,3 als Primzahl und es würden alle anderen Primzahlen ignoriert werden :-(

LG
 

ocsme

Top Contributor
vielen vielen Lieben Dank :)
Aber wie schon gesagt Arrays hatten wir noch nicht! und die muss man dann ja nutzen!
Dann funktioniert das auch genauso wie ich es mir gedacht habe.

Jetzt nur noch die Frage wieso sollte ich die obere Schranke n auf sqrt(n) setzen :-O kann mir das jemand mal genau erklären? Denn wie schon gesagt gibt das für mich wenig sinn wenn ich 2-20 Primzahlen suche und er bei n=20 sqrt = 4 macht :D
LG
 

JStein52

Top Contributor
Aus Wikipedia:
Zunächst werden alle Zahlen 2, 3, 4,… bis zu einem frei wählbaren Maximalwert S aufgeschrieben. Die zunächst unmarkierten Zahlen sind potentielle Primzahlen. Die kleinste unmarkierte Zahl ist immer eine Primzahl. Nachdem eine Primzahl gefunden wurde, werden alle Vielfachen dieser Primzahl als zusammengesetzt markiert. Man bestimmt die nächstgrößere nicht markierte Zahl. Da sie kein Vielfaches von Zahlen kleiner als sie selbst ist (sonst wäre sie markiert worden), kann sie nur durch eins und sich selbst teilbar sein. Folglich muss es sich um eine Primzahl handeln. Diese wird dementsprechend als Primzahl ausgegeben. Man streicht wieder alle Vielfachen und führt das Verfahren fort, bis man am Ende der Liste angekommen ist. Im Verlauf des Verfahrens werden alle Primzahlen ausgegeben.

Da mindestens ein Primfaktor einer zusammengesetzten Zahl immer kleiner gleich der Wurzel der Zahl sein muss, ist es ausreichend, nur die Vielfachen von Zahlen zu streichen, die kleiner oder gleich der Wurzel der Schranke S sind.

Ebenso genügt es beim Streichen der Vielfachen, mit dem Quadrat der Primzahl zu beginnen, da alle kleineren Vielfachen bereits markiert sind.
 

JStein52

Top Contributor
Und dieses erwähnte streichen von unmarkierten Zahlen (im Code des vorherigen Links entspricht das true oder false setzen) lässt sich natürlich nur durchführen wenn man irgendeine Art von Array benutzen kann/darf. Sonst geht diese Optimierung nicht.
 

Meniskusschaden

Top Contributor
Jetzt nur noch die Frage wieso sollte ich die obere Schranke n auf sqrt(n) setzen :-O kann mir das jemand mal genau erklären?
Wenn du einen Teiler hast, der größer als die Wurzel ist, muß es dazu ja auch einen passenden zweiten Teiler geben, der kleiner als die Wurzel ist und den hast du dann ja bereits gefunden und weißt somit, dass es keine Primzahl ist.
Denn wie schon gesagt gibt das für mich wenig sinn wenn ich 2-20 Primzahlen suche und er bei n=20 sqrt = 4 macht
Selbst wenn die Wurzel aus 20 tatsächlich vier wäre, müsstest du die vier natürlich dazu nehmen. Wenn der Teilerkandidat genau der Wurzel entspricht, gehört er gerade noch zum relevanten Bereich (Beispiel 25 und 5). Die Wurzel aus 20 ist aber größer als vier, also gehört vier sowieso dazu.
 
Ähnliche Java Themen
  Titel Forum Antworten Datum
P Primzahl mit Angabe der höchsten Primzahl und Angabe der Anzahl von Primzahlen bis 100 Java Basics - Anfänger-Themen 8
C Ganzzahlige Werte in Boolean ausgeben und überprüfen ob Primzahl oder nicht, wenn es keine Primzahl ist soll es die Primfaktorzerlegung ausgeben Java Basics - Anfänger-Themen 4
O Primzahl rekursiv mit einem Wert ohne i, wie? Java Basics - Anfänger-Themen 6
O Erste Schritte Primzahl Methode Java Basics - Anfänger-Themen 8
I Erste Schritte Testen, ob eine Zahl eine Primzahl ist Java Basics - Anfänger-Themen 8
D Primzahl Aufgabe Java Basics - Anfänger-Themen 5
R Primzahl ja/nein - besserer Code möglich? Java Basics - Anfänger-Themen 2
T Primzahl Java Basics - Anfänger-Themen 12
I Höchste Zahl berechnen die eine Eingabe ohne Rest teilt und eine Primzahl ist Java Basics - Anfänger-Themen 2
U Primzahl-Tester Java Basics - Anfänger-Themen 3
A 10001-te Primzahl herausfinden Java Basics - Anfänger-Themen 5
L primzahl Java Basics - Anfänger-Themen 54
R Primzahl kleiner 3 Java Basics - Anfänger-Themen 2
T Primzahl Schleife Java Basics - Anfänger-Themen 15
X Primzahl Ausgabe falsch Java Basics - Anfänger-Themen 10
M Primzahl Java Basics - Anfänger-Themen 11
D Array Fehler / groesste Primzahl suchen Java Basics - Anfänger-Themen 4
F Primzahl oder nicht?! Java Basics - Anfänger-Themen 7
S Primzahl in einem Array finden Java Basics - Anfänger-Themen 21
J Primzahl mit for Schleife Java Basics - Anfänger-Themen 4
A Fehler im Primzahl Programm Java Basics - Anfänger-Themen 17
S Primzahl berechnen in Java Java Basics - Anfänger-Themen 7
K Primzahl//immer true Java Basics - Anfänger-Themen 7
ven000m Primzahl.class wie starte ich diese einzelne Datei? Java Basics - Anfänger-Themen 10
M Primzahl Java Basics - Anfänger-Themen 8
W Nächstgelegene Primzahl Java Basics - Anfänger-Themen 3
I Primzahl suchen Java Basics - Anfänger-Themen 5
G primzahl oder nicht? Java Basics - Anfänger-Themen 16

Ähnliche Java Themen

Neue Themen


Oben