Primzahl

timmec

Mitglied
Hey, habe folgenden Skript und soll mit einem Kommandozeilenbefehl ausgeben können, ob es sich um eine Primzahl handel, oder nicht. Aber es klappt nicht.
Java:
public class PrimalityTest {
   public static void main(String[] args) {
     int t = Integer.parseInt(args[0]);
     int counter;
     boolean prim;

     for(int number = 2; number <= t; number++) {
       prim = true;
       for(counter = 2; counter <= (number/2); counter++) {
         if (t % counter == 0) {
           prim = false; System.out.println("Keine Primzahl");
           break;
         }
       }
     }
     if (prim = true) {
       System.out.println("Eine Primzahl");
     }
   }
}
Danke
 
Zuletzt bearbeitet von einem Moderator:
Aber es klappt nicht.

"es klappt nicht" ist keine Fehlerbeschreibung.
Was klappt nicht? Was erwartest du die für eine Ausgabe (mit welcher Eingabe) und welche Ausgabe bekommst du stattdessen?
(Bitte in Zukunft eine präzisere Beschreibung des Problems 🙂)

Ein Problem ist sofort ersichtlich: Bei deiner letzten if-Bedingung machst du eine Zuweisung keinen Vergleich!
"=" bedeutet etwas anderes als "==" 😉
 
moin
1. code-tags verwenden (das symbol links der diskette, also nicht der pfeil ^^)
2. nur wenig whitespace
3. der vergleich auf boolean == true ist blödsinn, weil if schon ein true erwartet
also ist der false-fall gleich dem else
Java:
public class PrimalityTest {

    public static void main(String[] args) {
        new PrimalityTest();
        int firstArg =0;
        if( args.length >0){
            try {
                firstArg = Integer.parseInt(args[0]);
            } catch (NumberFormatException e) {
                System.err.println("Argument" + args[0] + " must be an integer.");
                System.exit(1);
            }
        }
      
        int counter;
        boolean prim =false;

        for( int number = 2; number <= firstArg; number++){
            prim = true;
            for(counter = 2; counter <= (number/2); counter++){
                if(firstArg % counter == 0){
                    prim = false;
                    break;
                }
            }
        }

        if( prim) {
            System.out.println("Eine Primzahl");
        } else{
            System.out.println("Keine Primzahl");
        }
    }
}

ausführen mit Argument von der Konsole
D:\pt>java PrimalityTest 2
Eine Primzahl

D:\pt>
 
Mein Problem ist die Ausgabe. Bei der Eingabe von 3,5,7, 17,19 kommt die gewünschte Ausgabe von " Ist Primzahl", bei anderen Werten kommt die Ausgabe von Keine Primzahl, und das je öfter, desto höher der eingegebene Wert. Zudem steht am Ende "ist Primzahl". also bsp . Keine Primzahl...Keine Primzahl, Ist Primzahl
 
Wie Jose schon schrieb ist prim = true eine Zuweisung und kein Vergleich. Daher gilt für diesen Ausdruck immer true und somit wird "Eine Primzahl" natürlich auch hinter jeder Zahl angefügt.

"Keine Primzahl" kommt öfters, da es in jedem for-Durchlauf (mit counter als Zählvariable) neu geschrieben wird. Du versuchst zwar mit "break" zu stoppen, sobald ein Teiler gefunden wird, allerdings stoppt "break" immer nur die aktuelle Sequenz (hier also die if-Abfrage), die for-Schleife läuft hingegen weiter.
Pack das break einfach hinter die if-Abfrage und teste da sowas wie if(prim==false) break;
(Da es hier nur eine Anweisung in der if-Abfrage gibt, spannt diese keine eigene Sequenz auf und break beendet stattdessen wie gewünscht die for-Schleife)
 
"Keine Primzahl" kommt öfters, da es in jedem for-Durchlauf (mit counter als Zählvariable) neu geschrieben wird. Du versuchst zwar mit "break" zu stoppen, sobald ein Teiler gefunden wird, allerdings stoppt "break" immer nur die aktuelle Sequenz (hier also die if-Abfrage), die for-Schleife läuft hingegen weiter.

Falsch, das break stoppt die innere for-Schleife! Würde es das break hinter die if-Abfrage geben dann bräucht er keine innere Schleife mehr da diese sowieso nur 1x durchlaufen werden würde.
Aber da er eben 2 verschachtelte Schleifen hat wird die innere immer wieder von neuen angestupst 😉

Er müsste der äußeren Schleife ein Label geben und diese beim break angeben.
 
es wird verwendet, wenn man 2 als Argument übergibt ;-)
Hab den code angepasst so dass es etwas schneller geht. Sobald eine Primzahl gefunden wird bricht das break die for-schleife ab und die ausgabe erfolgt
Java:
public class PrimalityTest {

    public static void main(String[] args) {
        new PrimalityTest();
        int firstArg =0;
        if( args.length >0){
            try {
                firstArg = Integer.parseInt(args[0]);
            } catch (NumberFormatException e) {
                System.err.println("Argument" + args[0] + " must be an integer.");
                System.exit(1);
            }
        }
      
        int counter;
        boolean prim =false;

        for( int number =2; number <=firstArg/2+1; number++){
            if( firstArg %number ==0){
                prim =true;
                break;
            }
        }
        if( prim) {
            System.out.println( "" +firstArg +" ist eine Primzahl");
        } else{
            System.out.println("" +firstArg +" keine Primzahl");
        }
      
    }
}
 
ich steh gerade bei dem was du sagst auf dem Schlauch. Hab mir seinen Code kopiert und formatiert, und alles was ich für nicht sinnvoll erachtet habe, flog beim zweiten post raus.
und wir tauschen keine PM s ;-) aus
 
ich steh gerade bei dem was du sagst auf dem Schlauch
Der TE erwähnte die Ausgabe "ist Primzahl", und die wird so wörtlich weder in einem deiner noch in einem der Postings vom TE verwendet, nur haöt sehr ähnliche wie "Eine Primzahl", "ist eine Primzahl" bzw. "keine Primzahl".
Entweder der TE hat die Ausgabe nicht korrekt wiedergegeben, oder er verwendet einen Code den er bisher nicht gepostet hat.
So wies aussieht funktioniert deiner.
Der vom TE müsste auch funktionieren (ao auf en ersten Blick, ohne ihn getestet zu haben). Der Code vom TE prüft nicht nur die eingegebenZahl darauf, ob sie eine Primzahl ist, sondern alle Zahlen von 2 bis zur eingegebenen Zahl (einschliesslich). Nur die sysouts im Code vom TE sind nicht besonders hilfreich.
 

Zurück
Oben