Primzahlzwillinge

Hallo bin neu hier.
Ich soll ein Programm erstellen dass alle Primzahlenzwillinge bis 10 000 Ausgibt.

Die genaue Aufgabenstellung lautet:

Zwei Primzahlen p und q heissen Primzahlzwilling (oder Primzahlpaar), wenn ihre Differenz 2 ist. 3 / 5, 5 / 7, 11 / 13 sind zum Beispiel die ersten drei Primzahlzwillinge. Implementieren Sie ein Java-Programm, welches alle Primzahlzwillinge bis zu 10000 berechnet und auf dem Bildschirm ausgibt.

Ich konnte diese Anforderung nicht einmal annähernd erfüllen. Ich bitte euch mir zu helfen. Ich bin ein absoluter Anfänger in Java und wir sind gerade erst bei for Schleifen angekommen.

Das ist mein gescheiterter Versuch:

Javascript:
public static void main(String[] args) {
        // TODO code application logic here
        float zahl;
        float b;
        int x=1;
        float output = 0;
        int output2 = 0;
        
        for (zahl=1; zahl <= 10000; zahl++)
        {
            
                for (b=2; b <= 10000; b++)
                {
                    if (b!=zahl)
                    {
                        output = zahl/b;
                        output2 = (int) (zahl/b);
                        
                        if ((float)(output - output2)==0)
                            break;
                    }
                }   
            
            if ((float)(output - output2) != 0)
            {
                if (x==2)
                {
                    System.out.print((int)zahl + "\n");
                    x=1;
                }
                else
                if (x==1)
                {
                    x=2;
                    System.out.print((int)zahl + " / ");
                }
            } 
            
        }
    }
 
Ich habe mich an dem Problem noch einmal versucht und bin dem Ergebnis ein wenig näher gekommen. Ich glaube mit ein paar Änderungen könnte es funktionieren.

Javascript:
        float p;
        float q;
        float b;
        float output = 0;
        int output2 = 0;
        
        for (p=1; p <= 10000; p++)
        {
            
                for (b=2; b <= 10000; b++)
                {
                    if (b!=p)
                    {
                        output = p/b;
                        output2 = (int) (p/b);
                        
                        if ((float)(output - output2)==0)
                            break;
                    }
                }
                if ((float)(output - output2) != 0)
                {
                    if (b!=p+2)
                    {
                        output = (p+2)/b;
                        output2 = (int) ((p+2)/b);
                        
                        if ((float)(output - output2) != 0)
                        {
                            q=p+2;
                            System.out.println((int)p + " / " + (int)q);
                        }
                    }
                }
        }
 

vfl_freak

Premium-User
Moin,

ich werde jetzt gar nicht erst versuchen, Deinen unkommentierten Code nachzuvollziehen!!

Dazu gibt es haufenweise Beispiele im Netz, bsp.: Code!!
VG Klaus
 
Moin,

ich werde jetzt gar nicht erst versuchen, Deinen unkommentierten Code nachzuvollziehen!!

Dazu gibt es haufenweise Beispiele im Netz, bsp.: Code!!
VG Klaus
danke für die Antwort!

ich habe jedoch in der Zwischenzeit schon eine Lösung gefunden.

Javascript:
float p;
        float q;
        float b;
        float output_p = 0;
        int output_p2 = 0;
        float output_q = 0;
        int output_q2 = 0;
        
        for (p=3; p <= 10000; p++)
        {
            
                for (b=2; b <= 10000; b++)
                {
                    if (b!=p) //berechnen ob p eine Primzahl ist
                    {
                        output_p = p/b;
                        output_p2 = (int) (p/b);
                        
                        if ((float)(output_p - output_p2)==0) //wenn p keine Primzahl ist: break
                            break;
                    }
                    if (b!=(p+2)) //berechnen ob q eine Primzahl ist (q=p+2)
                    {
                        output_q = (p+2)/b;
                        output_q2 = (int) ((p+2)/b);
                        
                        if ((float)(output_q - output_q2)==0) //wenn q keine Primzahl ist: break
                            break;
                    }
                    
                }
                if ((float)(output_p - output_p2) != 0) //wenn p und q beides eine Primzahl sind: p und q ausgeben
                {
                    if ((float)(output_q - output_q2) != 0)
                        {
                            q=p+2;
                            System.out.println((int)p + " / " + (int)q);
                            p=p+1;
                        }
                    } 
        }
 

ComFreek

Mod | @comfreek
Moderator
Die Nutzung von floats hier ist a) unnötig und b) auch möglicherweise falsch. Du vergleichst Float-Values mit == (z. B. mit (float)(output_p - output_p2)==0), das ist fast immer falsch!

Außerdem sind deine Variablennamen nichtssagend. Versuche erstmal eine neue Methode isPrime zu entwickeln und diese dann aufzurufen.

@Technipion: Lust auf einen Code Golf? Ich hab das Gefühl, dass man das hier auch in einem Einzeiler machen könnte ;D Kennst du schon den Regex, der eine Zahl auf Primalität überprüft? Da gibt's einen hochvotierten StackOverflow-Beitrag zu.
 
Die Nutzung von floats hier ist a) unnötig und b) auch möglicherweise falsch. Du vergleichst Float-Values mit == (z. B. mit (float)(output_p - output_p2)==0), das ist fast immer falsch!

Außerdem sind deine Variablennamen nichtssagend. Versuche erstmal eine neue Methode isPrime zu entwickeln und diese dann aufzurufen.

@Technipion: Lust auf einen Code Golf? Ich hab das Gefühl, dass man das hier auch in einem Einzeiler machen könnte ;D Kennst du schon den Regex, der eine Zahl auf Primalität überprüft? Da gibt's einen hochvotierten StackOverflow-Beitrag zu.

danke für die Verbesserungsvorschläge!

ich muss mir erst mal ein tutorial reinziehen und schauen was isPrime überhaup ist xD.
 

Technipion

Erfahrenes Mitglied
und schauen was isPrime überhaup ist xD
@ComFreek hat damit gemeint, dass du selbst eine Funktion entwerfen sollst, die prüft ob eine Zahl eine Primzahl ist :D

Aber viel wichtiger ist, dass du von den float wegkommst und Integer-Arithmetik benutzt. Schaffst du das alleine? Wenn nicht: Wo hakt es?

Und immer schön deinen aktuellen Code mitposten, das hast du bis jetzt vorbildlich gemacht!

Gruß Technipion

PS: Als Kontrollergebnis kann ich dir verraten, dass es 205 Primzahlzwillinge bis 10.000 gibt.