Primzahlen - die ersten 100

Java The Hutt

Mitglied
Grüße euch :)

Ich versuche gerade ein Programm zu schreiben, welches mir die 1. 100 Primzahlen ausgibt.

Folgendes Programm:
Java:
public class Primzahlen {

    public static void main(String[] args) {

        double zahl = 0;
        int counter = 0;

        while (counter <= 25) {
            zahl++;


            for (int i = 2; i <= Math.sqrt(zahl); i++) {    //Teiler Maximal so groß wie Wurzel der Zahl
                if (zahl % i == 0) {
                    System.out.println(zahl);

            
                    

                    counter++;
                    break;    //Raus aus der For-Schleife, nachdem Teiler gefunden.
                
                
                }
                
            }
        }

        System.out.println("Durchgänge durch Schleife\t" + zahl);

    }
}

Jedoch habe ich zwei Probleme:
Das erste, er gibt mir die Zahlen aus, die keine Primzahlen sind. Und Primzahlen selber gibt er nicht aus. Wie kann ich das realisieren?
Das Zweite Problem:
Die ersten 100 Primzahlen gehen bis 541. Meine Schleife geht jedoch nur bis 134. Also Zählt er teilweise doppelt hoch.

Ich bitte um Hilfe :)
 

mihe7

Top Contributor
D. h. Du könntest vorab eine Variable auf false setzen und nach der Schleife sagt Dir die Variable, ob die Zahl teilbar ist...
 

Java The Hutt

Mitglied
So in etwa?

Java:
public class Primzahlen {

    public static void main(String[] args) {

        double zahl = 0;
        int counter = 0;
        boolean istPrimzahl = false;

        while (counter <= 25) {
            zahl++;


            for (int i = 2; i <= Math.sqrt(zahl); i++) {    //Teiler Maximal so groß wie Wurzel der Zahl
                if (zahl % i == 0) {
                   
                    istPrimzahl = true;

           
                 

                    counter++;
                    break;    //Raus aus der For-Schleife, nachdem Teiler gefunden.
               
               
                } if (istPrimzahl) {
                    System.out.println(zahl);
               
                }
            }
           
           
           
        }

        System.out.println("Durchgänge durch Schleife\t" + zahl);

    }
}
 

mihe7

Top Contributor
Jein.
1. Du hast vorhin geschrieben, dass Du in der Schleife prüfst, ob die Zahl teilbar ist, nicht ob sie eine Primzahl ist. Mach aus "istPrimzahl" ein "istTeilbar" (oder tausche true und false) dann stimmt das soweit.
2. Die Prüfung, ob die Variable true ist, muss außerhalb der Schleife passieren.
 

Java The Hutt

Mitglied
Java:
public class Primzahlen {

    public static void main(String[] args) {

        double zahl = 0;
        int counter = 0;
        boolean istPrimzahl = false;                         // Es ist prinzipiell nie eine Primzahl

        while (counter < 100) {
            zahl++;

            for (int i = 2; i <= Math.sqrt(zahl); i++) {     // Teiler Maximal so groß wie Wurzel der Zahl
                if (zahl % i == 0) {

                    istPrimzahl = false;                     // Wenn Zahl Teilbar, dann keine Primzahl bestätigen

                    
                    break;                                     // Raus aus der For-Schleife, nachdem Teiler gefunden.

                } else {
                    istPrimzahl = true;                     // Sofern Zahl nie Teilbar, dann setze Primzahl = true

                }

            }
            if (istPrimzahl) {                                //Ausgabe der Zahl, wenn unteilbare Zahl erkannt
                System.out.println(zahl);
                counter++;                                    //Counter ++, sofern eine entdeckt wurde.
            }

        }

    }
}

Eine Frage noch, die 100. Primzahl ist 541. Wieso werden 2 Primzahlen mehr angegeben?
 

Java The Hutt

Mitglied
Java:
public class Primzahlen {

    public static void main(String[] args) {

        double zahl = 0;
        int counter = 0;
        boolean istPrimzahl = false;                         // Es ist prinzipiell nie eine Primzahl

        while (counter < 100) {
            zahl++;

            for (int i = 2; i <= Math.sqrt(zahl); i++) {     // Teiler Maximal so groß wie Wurzel der Zahl
                if (zahl % i == 0) {

                    istPrimzahl = false;                     // Wenn Zahl Teilbar, dann keine Primzahl bestätigen

                  
                    break;                                     // Raus aus der For-Schleife, nachdem Teiler gefunden.

                } else {
                    istPrimzahl = true;                     // Sofern Zahl nie Teilbar, dann setze Primzahl = true

                }

            }
            if (istPrimzahl) {                                //Ausgabe der Zahl, wenn unteilbare Zahl erkannt
                System.out.println(zahl);
                counter++;                                    //Counter ++, sofern eine entdeckt wurde.
            }

        }

    }
}

Eine Frage noch, die 100. Primzahl ist 541. Wieso werden 2 Primzahlen mehr angegeben?

Erledigt, die 2 und 3 wird ja nicht mit ausgegeben :D
Was kann ich machen, außer manuell die 2 und 3 ausgeben zu lassen? :D
 

mihe7

Top Contributor
Nein. Die Idee ist ganz einfach: eine Zahl ist so lange eine Primzahl, bis das Gegenteil bewiesen ist.

Java:
while (counter < 100) {
    zahl++;  

    // wir gehen davon aus, dass zahl eine Primzahl ist
    boolean istPrimzahl = true;

    // gilt die Primzahl-Eigenschaft für alle möglichen Teiler zwischen 2 und sqrt(x)?
    for (int i = 2; i <= Math.sqrt(zahl); i++) {
        if (zahl % i == 0) {
            istPrimzahl = false;
        }
    }

    // falls ja, ist zahl eine Primzahl
    if (istPrimzahl) {
        counter++;
    }
}
Der Code lässt sich noch stark optimieren, aber jetzt geht es erstmal ums Prinzip.
 

Java The Hutt

Mitglied
Ich danke Dir für die Hilfe!
Nein. Die Idee ist ganz einfach: eine Zahl ist so lange eine Primzahl, bis das Gegenteil bewiesen ist.

Java:
while (counter < 100) {
    zahl++; 

    // wir gehen davon aus, dass zahl eine Primzahl ist
    boolean istPrimzahl = true;

    // gilt die Primzahl-Eigenschaft für alle möglichen Teiler zwischen 2 und sqrt(x)?
    for (int i = 2; i <= Math.sqrt(zahl); i++) {
        if (zahl % i == 0) {
            istPrimzahl = false;
        }
    }

    // falls ja, ist zahl eine Primzahl
    if (istPrimzahl) {
        counter++;
    }
}
Der Code lässt sich noch stark optimieren, aber jetzt geht es erstmal ums Prinzip.

Danke für Deine Unterstützung! Jetzt Interessiert mich aber, wie man den Code optimieren kann :)
 

mihe7

Top Contributor
Naja:
1. muss man immer bis Math.sqrt(zahl) laufen?
2. muss man in jedem Schleifendurchlauf Math.sqrt(zahl) berechnen?
3. wie viele gerade Primzahlen kennst Du?

Wenn man 1. abgearbeitet hat, kann man den Schleifenrumpf noch umschreiben zu

istPrimzahl = (zahl % i != 0);
 

Java The Hutt

Mitglied
Naja:
1. muss man immer bis Math.sqrt(zahl) laufen?
2. muss man in jedem Schleifendurchlauf Math.sqrt(zahl) berechnen?
3. wie viele gerade Primzahlen kennst Du?

Wenn man 1. abgearbeitet hat, kann man den Schleifenrumpf noch umschreiben zu

istPrimzahl = (zahl % i != 0);

Okay verstehe.
1) Das Problem kann gelöst werden, nachdem ein Teiler gefunden wurde, ein "Break" genutzt wird, um die Schleife zu beenden.
2) Dafür habe ich keine Idee :D
Die Lösung für das 3. Problem ist doch, dass ich anstatt zahl++; zahl+=2 nehme, somit fallen die geraden zahlen raus.
 

mihe7

Top Contributor
Der Reihe nach:
1) Ja, Du kannst auch einfach istPrimzahl zur zusätzlichen Schleifenbedingung machen:
Java:
for (int i = 2; istPrimzahl && i <= Math.sqrt(zahl); i++)
2) Aktuell wird bei jedem Schleifendurchlauf Math.sqrt(zahl) berechnet. Das Ergebnis ändert sich aber nicht, daher kannst Du das vorab berechnen, entweder
Java:
int max = (int) Math.sqrt(zahl);
for (int i = 2; istPrimzahl && i<= max; i++)
oder kurz:
Java:
for (int i = 2, max = (int)Math.sqrt(zahl); i <= max; i++)
3) Ja, Du musst aber natürlich in der Schleife bei 3 beginnen und gerade Zahlen vorab berücksichtigen :)

Java:
// wir wissen, dass 2 die erste Primzahl ist, also:
int zahl = 2;
int counter = 1;

while (counter < 100) {
    zahl++;
    if (zahl % 2 != 0) { // nur ungerade Zahlen müssen berücksichtigt werden
        boolean istPrimzahl = true;    
        while (int i = 3, max = (int)Math.sqrt(zahl); istPrimzahl && i <= max; i+=2) {
             istPrimzahl = (zahl % i != 0); 
        }
        if (istPrimzahl) counter++;
    }
}
...
 
Ähnliche Java Themen
  Titel Forum Antworten Datum
iAmFaiinez Primzahlen Tester ohne Array Java Basics - Anfänger-Themen 4
sserio Wieso werden nicht alle Primzahlen bis 1000 in meine Liste gepackt ? Java Basics - Anfänger-Themen 8
B Primzahlen bis 100 addieren Java Basics - Anfänger-Themen 16
H Primzahlen finden - Zeit optimieren Java Basics - Anfänger-Themen 34
S Primzahlen in Array ausgeben Java Basics - Anfänger-Themen 14
M Array auf Primzahlen prüfen Java Basics - Anfänger-Themen 7
D Primzahlen Rechner nach Eratostenes von Kyrene Algorithmus Java Basics - Anfänger-Themen 2
fendix Compiler-Fehler Algorithmus zur Bestimmung von Primzahlen Java Basics - Anfänger-Themen 7
P Methode die ausgibt wie viele Primzahlen es zwischen 2 und n gibt Java Basics - Anfänger-Themen 10
G Primzahlen von Rekursiv nach Iterativ Java Basics - Anfänger-Themen 6
M Rekursives Programm zum Anzeigen von Primzahlen Java Basics - Anfänger-Themen 3
P Primzahl mit Angabe der höchsten Primzahl und Angabe der Anzahl von Primzahlen bis 100 Java Basics - Anfänger-Themen 8
N Erste Schritte Primzahlen-ArrayIndexOutOfBounds Java Basics - Anfänger-Themen 23
R Primzahlen Zähler Programm / Benachbarte Primzahlen Java Basics - Anfänger-Themen 30
D Klassen Primzahlen überprüfen Java Basics - Anfänger-Themen 3
I Primzahlen Java Basics - Anfänger-Themen 17
Z Rekursion Primzahlen Java Basics - Anfänger-Themen 1
M Erste Schritte primzahlen ermitteln, nur zahlen als eingabe erlauben Java Basics - Anfänger-Themen 34
S Primzahlen berechnen funktioniert nicht richtig Java Basics - Anfänger-Themen 1
R primzahlen im array Java Basics - Anfänger-Themen 33
M Primzahlen, nur jede 2te ausgeben Java Basics - Anfänger-Themen 11
T Primzahlen Fehler Java Basics - Anfänger-Themen 4
K Primzahlen Java Basics - Anfänger-Themen 6
L Primzahlen im Array ausgeben Java Basics - Anfänger-Themen 3
P Primzahlen Java Basics - Anfänger-Themen 3
A Methoden Primzahlen erstellen von 1 bis 100-Codeprobleme Java Basics - Anfänger-Themen 2
H Variablenverfolgung - Primzahlen Java Basics - Anfänger-Themen 7
G Primzahlen Java Basics - Anfänger-Themen 6
D Primzahlen und Rekursive Liste Java Basics - Anfänger-Themen 29
S Primzahlen bis 1000 ausgeben Java Basics - Anfänger-Themen 3
K Methoden Primzahlen Java Basics - Anfänger-Themen 33
S Input/Output Primzahlen Datenbank Java Basics - Anfänger-Themen 11
F Primzahlen in Zahlenblöcken ausgeben Java Basics - Anfänger-Themen 9
M Primzahlen - es werden alle Nicht-Primzahlen ausgegeben Java Basics - Anfänger-Themen 5
M primzahlen Java Basics - Anfänger-Themen 4
S Programm zu Ermittlung von Primzahlen Java Basics - Anfänger-Themen 14
E Programm zum Primzahlen ausgeben-Fehler Java Basics - Anfänger-Themen 12
X Primzahlen Java Basics - Anfänger-Themen 7
S Primzahlen Java Basics - Anfänger-Themen 12
B Programmierobjekt - Primzahlen Java Basics - Anfänger-Themen 2
D Primzahlen ausgeben. Wo liegt der Fehler? Java Basics - Anfänger-Themen 4
N Primzahlen Java Basics - Anfänger-Themen 5
I Primzahlen check, String prüfen lassen. Java Basics - Anfänger-Themen 6
A OOP Programm zum bestimmen von Primzahlen, OutofBoundsException Java Basics - Anfänger-Themen 10
apple987123 Primzahlen Java Basics - Anfänger-Themen 12
A Primzahlen: ein paar offene Fragen Java Basics - Anfänger-Themen 2
T Primzahlen Java Basics - Anfänger-Themen 6
G Primzahlen Java Basics - Anfänger-Themen 18
B Primzahlen berechnen - Wieso unterschiedliche Java Basics - Anfänger-Themen 3
B Primzahlen Algorithmus - wo ist der Fehler ? Java Basics - Anfänger-Themen 2
E Primzahlen Java Basics - Anfänger-Themen 5
B Primzahlen mit Array errechnen! Java Basics - Anfänger-Themen 13
H Miller Rabin Test Primzahlen werden teilweise nicht gefunden Java Basics - Anfänger-Themen 5
M Wer kann mir bei Primzahlen helfen ? Java Basics - Anfänger-Themen 4
G Frage zur Primzahlen berechnung Java Basics - Anfänger-Themen 11
kulturfenster Primzahlen berechnen Java Basics - Anfänger-Themen 11
D Primzahlen Java Basics - Anfänger-Themen 4
N Zerlegung in Primzahlen Java Basics - Anfänger-Themen 7
F Programm Primzahlen Java Basics - Anfänger-Themen 5
J Primzahlen errechnen.ArrayLists abgleichen Java Basics - Anfänger-Themen 2
M Primzahlen Java Basics - Anfänger-Themen 6
C Primzahlen Java Basics - Anfänger-Themen 7
C Primzahlen Java Basics - Anfänger-Themen 2
S Primzahlen Java Basics - Anfänger-Themen 49
Ü Zweidimensionales Array in der ersten Zeile deklarieren Java Basics - Anfänger-Themen 13
K Warum wird mir hier nach dem ersten Durchlauf zwei mal "welchen Datentyp wollen sie übergeben?" ausgegeben ? Java Basics - Anfänger-Themen 1
M Stream mit den ersten n natürlichen Zahlen Java Basics - Anfänger-Themen 4
H Erste Schritte Warum misslingt die Auswertung des ersten Aufrufparameters? Java Basics - Anfänger-Themen 4
J Mein Programm läuft bei der ersten Eingabe nicht mehr weiter, woran liegt das? Java Basics - Anfänger-Themen 6
padde479 Array Multiplikation der ersten n Zahlen Java Basics - Anfänger-Themen 7
G Main Methode wird beim ersten Aufruf nicht richtig ausgeführt Java Basics - Anfänger-Themen 1
M Ersten Index von Array bestimmen Java Basics - Anfänger-Themen 14
O Methode in while-Schleife aufrufen geht nur beim ersten Mal Java Basics - Anfänger-Themen 2
KogoroMori21 Vorbereitung auf die Programmieren Klausur vom ersten Semester Java Basics - Anfänger-Themen 4
1 Erste Schritte Was denkt ihr über eines meiner ersten Javaprogramme? Java Basics - Anfänger-Themen 2
H Ersten Zug bestimmen Java Basics - Anfänger-Themen 12
M JComboBox ersten Eintrag leerlassen bzw. Platzhalter Java Basics - Anfänger-Themen 1
J Erste Schritte Feedback zum ersten Anfängerprogramm Java Basics - Anfänger-Themen 6
Z Ersten Buchstaben eines Elements eines String-Arrays auslesen Java Basics - Anfänger-Themen 5
M Methoden while liefert nur den ersten Datensatz Java Basics - Anfänger-Themen 12
C Entfernen des ersten String-Elements Java Basics - Anfänger-Themen 6
T static String Variable wird nur beim ersten aufruf durch eine Funktion geändert. Java Basics - Anfänger-Themen 16
K Frage zu meinem ersten Programm Java Basics - Anfänger-Themen 5
K OOP Die ersten Schritte bei der Programierung Java Basics - Anfänger-Themen 1
S Die ersten vier perfekte Zahlen. Java Basics - Anfänger-Themen 30
Z Meine ersten Gehversuche Java Basics - Anfänger-Themen 11
D Problem mit meinem ersten JOptionPane - Fatal exception occurred. Program will exit. Java Basics - Anfänger-Themen 6
M Ausführen des ersten Java Programms Java Basics - Anfänger-Themen 2
S Problem beim ersten compilieren überhaubt Java Basics - Anfänger-Themen 43
T gebe mir den ersten eltern knoten Java Basics - Anfänger-Themen 3
C ArrayIndexOutOfBoundsException bei meinem ersten objektiorientierten Programm Java Basics - Anfänger-Themen 4
X SAX die ersten Schritte Java Basics - Anfänger-Themen 5
T Datenbank automatisch erzeugen beim ersten Start Java Basics - Anfänger-Themen 6
I Problem beim Schreiben eines ersten Programms Java Basics - Anfänger-Themen 3
Semox Ersten Wert eines Intervalls bei Berechnung einschließen Java Basics - Anfänger-Themen 8
B Ersten Eintrag aus einer Map bekommen Java Basics - Anfänger-Themen 11
A Die Werte der ersten beiden markierten Check-Boxen registrieren Java Basics - Anfänger-Themen 11
T zweiter Timer überschreibt den ersten Timer ? Java Basics - Anfänger-Themen 5
D Suche in JList nach dem ersten Buchstaben Java Basics - Anfänger-Themen 2
T zweiter thread killt den ersten Java Basics - Anfänger-Themen 2

Ähnliche Java Themen

Neue Themen


Oben