Primzahl kleiner 3

r1d1

Mitglied
So ich bin's nochmal,

wollte mir als Übung mal ein kleines Programm schreiben, welches mir bei einer eingegebenen Zahl ausgibt, ob es eine Primzahl ist oder nicht. Dazu folgender Code:

Java:
import javax.swing.JOptionPane;

public class Primzahl {

	public static void main(String args[]) {
		String eingabe;
		int x; // Zahl die geprüft werden soll

		eingabe = JOptionPane.showInputDialog("Primzahl ja oder nein?");
		x = Integer.parseInt(eingabe);

		for (int i = (x - 1); i > 1; i--) // ab hier wird x durch immer kleiner werdende
			                              // Zahlen ab (x-1) bis 2 geteilt;
		{
			int proof = x % i;           
			if (proof == 0) // kommt als Restwert nur ein einziges mal 0 heraus erfolgt  
				            // die Ausgabe und das Programm ist beendet;
			{ 
				System.out.println(x + " ist keine Primzahl");
				break;
				
			} else {
				if (i == 2) // wenn i bei 2 angelangt ist war das der letzte Durchlauf
					        // der for-Schleife; x ist dann also eine Primzahl;
				{
					System.out.println(x + " ist eine Primzahl");
				} else {

				}
			}
		}
	}
}

Funktioniert soweit wunderbar, nur wenn ich eine Zahl kleiner 3 eingebe natürlich nicht. Mir ist auch klar, DASS es nicht funktionieren kann, aber ich habe keine andere Idee es umzusetzen. Bräuchte da nen kleinen Denkanstoß :D
Ich würde auch gerne von den erfahreneren Programmierern wissen, ob der Code stilistisch gesehen in Ordnung ist, ich habe nämlich das Gefühl, dass man das ganze auch kürzer/besser schreiben kann, oder ob sonst irgendwelche Mängel zwecks des Programmierstils auffallen.





Vielleicht können diejenigen ja auch mal einen Blick auf folgendes Programm werfen, welches mir die
Fakultät einer Zahl ausgibt:

Java:
import javax.swing.JOptionPane;

public class Fakultät {

	public static void main(String args[]) {
		methode();
	}

	public static void methode() {
		String eingabe;

		int x;

		eingabe = JOptionPane.showInputDialog("Fakultät von");

		x = Integer.parseInt(eingabe);

		int ergebnis = 1;

		for (int i = 1; i <= x; i++) {
			ergebnis = ergebnis * i;
		}

		System.out.println("Die Fakultät von " + x + " ist: " + ergebnis + ".");

		exit();
	}

	public static void exit() {
		String exitus;
		exitus = JOptionPane.showInputDialog("Exit 1, Continue 2");
		int b = Integer.parseInt(exitus);

		switch (b) {
		case 1:
			break;
		case 2:
			methode();
		default:
			exit();
		}
	}
}

Funktioniert wunderbar, nur der Code kommt mir etwas unbeholfen vor. Ich bin aktuell noch Schüler und habe vor mir programmieren zum Beruf zu machen, und ich denke es ist wichtig und nur von Vorteil wenn man sich von Anfang an einen guten Stil angewöhnt, von dem her bitte ich lieber nochmal um Rückfrage^^
 
B

bone2

Gast
Java:
    public static void main(String args[]) {
        String input = JOptionPane.showInputDialog("Primzahl ja oder nein?");
        int x = Integer.parseInt(input);

        // ab hier wird x durch immer kleiner werdende
        // Zahlen ab (x-1) bis 2 geteilt;
        for (int i = (x - 1); i > 1; i--) {
            // kommt als Restwert nur ein einziges mal 0 heraus erfolgt
            // die Ausgabe und das Programm ist beendet;
            if (x % i == 0) {
                System.out.println(x + " ist keine Primzahl");
                return;
            }
        }

        System.out.println(x + " ist eine Primzahl");
    }

ein wenig eingekürzt und vor allem mit kommentaren deutlich besser lesbar.
wechsel nicht zwischen deutsch und englisch (eingabe+beweise oder input+proof)
einrücken ist okay, klammersetzung durchweg bebehalten (kommentare und so)
 

xehpuk

Top Contributor
Du solltest du Funktionalität möglichst allgemein halten. Was ich damit meine: Deine beiden Berechnungen sind nur anwendbar, wenn du sie wirklich nur auf der Konsole haben möchtest. Besser wäre es, die Berechnungen in eigenen Operationen mit Rückgabewert zu haben und diese, wenn gewünscht, auf der Konsole ausgeben.
Außerdem solltest du auf mögliche Exceptions achten. Der Anwender könnte etwas anderes als eine Zahl eingeben und dein Programm dadurch zum Absturz bringen (
Code:
NumberFormatException
wird geschmissen).

Zur Primzahlberechnung:
Von der Grundfunktionalität in Ordnung, müsstest zur korrekten Berechnung anfangs überprüfen, ob die Zahl < 2 ist und dann eben false ausgeben. Aus Performancegründen könnte man den Algorithmus noch verbessern, indem man
  1. Die Teiler von klein nach groß durchgeht.
  2. Anfangs durch 2 teilt und dann nur noch durch ungerade Zahlen.
  3. Nur bis zur Quadratwurzel der angegebenen Zahl überprüft (denn wenn es einen Teiler gibt, der größer ist als die Quadratwurzel, so ist das Ergebnis der Division kleiner als die Quadratwurzel, wurde also bereits überprüft).

Es gibt natürlich noch weitaus bessere Algorithmen, aber sowas sollte anfangs genügen:
Java:
import javax.swing.JOptionPane;

public class Primzahl {
	public static void main(String args[]) {
		String eingabe;
		int x; // Zahl die geprüft werden soll
		
		while (true) {
			eingabe = JOptionPane.showInputDialog("Primzahl ja oder nein?");
			try {
				x = Integer.parseInt(eingabe);
				break;
			} catch (NumberFormatException nfe) {
				System.err.println("\"" + eingabe + "\" ist keine Zahl!");
			}
		}
		
		System.out.println(x + " ist " + (isPrime(x) ? "" : "k") + "eine Primzahl.");
	}
	
	public static boolean isPrime(int probablePrime) {
		if (probablePrime < 2)
			return false; // Zahl ist kleiner als 2, also nicht prim.
		if (probablePrime == 2)
			return true; // 2 ist eine Primzahl.
		if (probablePrime % 2 == 0)
			return false; // Alle geraden Zahlen (bis auf die 2, s. o.) sind nicht prim.
		for (int divisor = 3; divisor <= Math.sqrt(probablePrime); divisor += 2) { // Alle ungeraden Teiler bis einschließlich zur Quadratwurzel durchgehen.
			if (probablePrime % divisor == 0)
				return false; // Teiler gefunden, also nicht prim.
		}
		return true; // Keinen Teiler gefunden, also prim.
	}

Zur Fakultät:
Auch hier stimmt die Grundfunktionalität (ist ja nur eine for-Schleife), hier gelten jedoch auch die oben angesprochenen Dinge (Operation auslagern mit Rückgabewert, Exception-Handling).
Dazu kommt hier noch, dass die Fakultät schnell sehr groß wird, weswegen der Wertebereich von
Code:
int
hier leicht erschöpft ist. Stattdessen sollte
Code:
BigInteger
verwendet werden, welches beliebig große Zahlen annehmen kann.

So könnte also bspw. der Algorithmus aussehen:
Java:
	public static BigInteger factorial(int n) {
		BigInteger result = BigInteger.ONE;
		for (int i = 2; i <= n; i++)
			result = result.multiply(BigInteger.valueOf(i));
		return result;
	}

Dann noch allgemeine Tipps zu Code Conventions: Allen Bezeichnern möglichst präzise Namen geben ("methode" und "x" sind dies wohl nicht unbedingt ;)) und Sonderzeichen rauslassen ("Fakultät" -> "Fakultaet").
 
Ä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
O Primzahl bis n Java Basics - Anfänger-Themen 5
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
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
M Eine Methode die erkennt ob die ein gegebene zahl größer oder kleiner sein muss Java Basics - Anfänger-Themen 2
KogoroMori21 Java Datum Differenz (kleiner Fehler) Java Basics - Anfänger-Themen 10
A jar File kleiner bekommen Java Basics - Anfänger-Themen 3
O Vererbung Ueben mit kleiner Datenstruktur von Räumen Java Basics - Anfänger-Themen 10
P String größer kleiner gleich vergleichen Java Basics - Anfänger-Themen 6
Q Variablen If Anweisung, kleiner fehler Java Basics - Anfänger-Themen 8
F Kleiner Formatierungsfehler Java Basics - Anfänger-Themen 3
J Kleiner Taschenrechner! Anfänger braucht Hilfe :( Java Basics - Anfänger-Themen 2
S GUI kann im WindowBuilder nicht mehr (größer kleiner ziehen) Java Basics - Anfänger-Themen 2
D kleiner Taschenrechner mit switch fehlerhaft Java Basics - Anfänger-Themen 1
H Erste Schritte Ergebniss soll kleiner als 1000 sein Java Basics - Anfänger-Themen 4
DStrohma Operatoren Kleiner-Zeichen in Größer-Zeichen ändern wenn boolen true? Java Basics - Anfänger-Themen 6
M Kleiner unauffindbarer Fehler im Programm Java Basics - Anfänger-Themen 6
E Erste Schritte Array soll kleiner werdenden String erstellen Java Basics - Anfänger-Themen 5
J Vererbung Kleiner Fehler, weiß aber nicht warum und wo Java Basics - Anfänger-Themen 9
R Inhalt vom String größer oder kleiner als Java Basics - Anfänger-Themen 16
J kleiner Fehler im FAQ Parser für mathematische Formeln Java Basics - Anfänger-Themen 5
F Objekte vergleichen kleiner/größer? Java Basics - Anfänger-Themen 4
L Kleiner erster p2p-Chat Problem Java Basics - Anfänger-Themen 2
K Kleiner Fehler bei Methoden Implementierung Java Basics - Anfänger-Themen 6
O Ist diese Zahl größer oder kleiner 0? Java Basics - Anfänger-Themen 6
M Kleiner Fehler im Array... Java Basics - Anfänger-Themen 2
E BubbleSort kleiner Fehler? Java Basics - Anfänger-Themen 14
T kleiner fehler mit der "Zählvariable" Java Basics - Anfänger-Themen 6
S Kleiner Palindromtest Java Basics - Anfänger-Themen 4
C Größer - Kleiner - Zeichen in Strings Java Basics - Anfänger-Themen 3
M Kleiner Vokabeltrainier Java Basics - Anfänger-Themen 45
V Kleiner Wecker mit Gui (Brauche Tipps) Java Basics - Anfänger-Themen 5
A JButton wird kleiner mit Border Java Basics - Anfänger-Themen 3
A Kleiner Fehler Java Basics - Anfänger-Themen 4
G Kleiner Denkfehler Java Basics - Anfänger-Themen 23
G Kleiner Währungsrechner - Probleme ! Java Basics - Anfänger-Themen 16
H Fenster größer kleiner machen(Inhalt soll mitziehen) Java Basics - Anfänger-Themen 4
F Kleiner Fehler, den ich aber leider nicht finde. Java Basics - Anfänger-Themen 4
G gerade zahlen größer und kleiner null Java Basics - Anfänger-Themen 6

Ähnliche Java Themen

Neue Themen


Oben