Primzahl ja/nein - besserer Code möglich?

RaylanGivens

Neues Mitglied
Hallo zusammen,
Aufgabe ist es, vom Benutzer des Programms eine Zahl einzulesen, welche anschließend dahingehend geprüft werden soll, ob sie prim ist, oder nicht. So sollte der Programmablauf sein:
Code:
Zahl: 17
17 ist prim.

Dies wäre mein Lösungsvorschlag (mit Kommentar):
Java:
import Prog1Tools.IOTools;
public class prim {
    public static void main() {
        int eingabe;
        int n;
       
        eingabe = IOTools.readInteger("Ihre Zahl: "); //Zahl wird eingelesen
       
        if (eingabe <= 0){
            System.out.println(eingabe + " ist eine ungültige Eingabe!"); //Nur für positive Zahlen
        }
        else if (eingabe == 1) {
            System.out.println(eingabe + " ist nicht prim!"); //1 ist per definitionem keine Primzahl
        }
        else {
            for(n=eingabe-1; n > 1; n--) {
                if (eingabe % n == 0) {
                    System.out.println(eingabe +" ist nicht prim!"); //Lässt sich die eingegebene Zahl ohne Rest durch eine Zahl, die nicht sie selbst und nicht 1 ist, teilen, so ist sie keine Primzahl!
                    break; //Ist die Zahl keine Primzahl, so kann die Schleife beendet werden.
                }
                else if (n==2 && eingabe % n != 0) { //Ist die Zahl auch nicht ohne Rest durch 2 teilbar, so ist sie prim.
                    System.out.println(eingabe + " ist prim!");
                }
                else {
                    continue; //eigentlich unnötig, da Schleife eh weiterlaufen würde.
                }
            }
        }
    }
}

Er tut zwar soweit das, was er tun sollte, aber irgendwie beschleicht mich das Gefühl, dass das nicht schön ist, wie ich es gelöst habe. Habt ihr Verbesserungsvorschläge oder würdet ihr sagen, es passt so?


Danke schon mal!
 
Also erstmal kann das letzte else weg, wie du ja im Kommentar schon angemerkt hast.

Und was helfen sollte ist die Tatsache, dass jede Zahl die nicht prim ist, einen Teiler hat der >1 und <=Wurzel der Zahl ist.

Entsprechend ist es besser die Prüfung bei 2 anzufangen und nur bis zu der Wurzel der Zahl zu prüfen.
 
Code mal in eine eigene Methode auslagern, damit Funktionalität auch richtig geclustert wird.
Man deklariert und initialisiert Variablen in einer Zeile (außer es ist nicht möglich - aber hier ist es der Fall).
Dann siehts vielleicht so aus:
Java:
public static void main(String... args) {
  int eingabe = IOTools.readInteger("Ihre Zahl: ");
 
  if (eingabe <= 0) {
    System.out.println(eingabe + " ist eine ungültige Eingabe!");
  } else if (isPrime(eingabe)) {
    System.out.println(eingabe + " ist prim");
  } else {
    System.out.println(eingabe + " ist nicht prim!");
  }
}

public static boolean isPrime(int n) {
  if (n < 2 || n != 2 && n % 2 == 0) {
    return false;
  } else {
    final int sqrt = (int) Math.sqrt(n);
    for (int i = 3; i <= sqrt; i += 2) {
      if (n % i == 0) {
        return false;
      }
    }
    return true;
  }
}
 

Neue Themen


Zurück
Oben