Sitzung: Jeden Freitag in der Vorlesungszeit ab 16 Uhr c. t. im MAR 0.005. In der vorlesungsfreien Zeit unregelmäßig (Jemensch da?). Macht mit!

Javakurs/Übungsaufgaben/Primzahlenaufgabe/Musterloesung: Unterschied zwischen den Versionen

(Optimierte Primzahllösung ersetzt)
K (Replaced Scanner.in with System.console() and some formatting/alignment)
 
Zeile 2: Zeile 2:
  
 
== Lösung: Einfacher Primzahlfinder==
 
== Lösung: Einfacher Primzahlfinder==
<nowiki>
+
<pre>
/**
+
public class PrimesSimple {
* @author Andy Gunschl (Freitagsrunde)
 
*
 
*/
 
public class Primzahl {
 
 
 
 
public static void main(String[] args) {
 
public static void main(String[] args) {
//Grenze bis zu der Primzahlen gesucht werden
+
// Grenze bis zu der Primzahlen gesucht werden
 
int n = 10;
 
int n = 10;
//beginne bei der Zahl 2 da 1 keine Primzahl ist
+
// beginne bei der Zahl 2 da 1 keine Primzahl ist
for(int i=2;i<=n;i++){
+
for (int i = 2; i <= n; i++) {
//isPrimzahl ist ein Wahrheitswert, um zu überprüfen ob wir eine Primzahl gefunden haben.
+
// isPrimzahl ist ein Wahrheitswert, um zu überprüfen ob wir eine
//falls nicht wird sie später auf false gesetzt.
+
// Primzahl gefunden haben. falls nicht wird sie später auf false
 +
// gesetzt.
 
boolean isPrimzahl = true;
 
boolean isPrimzahl = true;
//i durch jede Zahl kleiner als i zu teilen und zu überprüfen, ob ein Rest übrig bleibt.  
+
// i durch jede Zahl kleiner als i zu teilen und zu überprüfen, ob
//BSP. im wiki 25=i und j wäre die Variable die hochgezählt wird
+
// ein Rest übrig bleibt. BSP. im wiki 25=i und j wäre die Variable
for(int j=2;j<i && isPrimzahl;j++){
+
// die hochgezählt wird
//Wenn eine division als rest 0 hat dann ist die Zahl keine Primzahl
+
for (int j = 2; j < i && isPrimzahl; j++) {
//und somit ist isPrimzahl auf false zu setzten
+
// Wenn eine division als rest 0 hat dann ist die Zahl keine
if((i%j)==0){
+
// Primzahl und somit ist isPrimzahl auf false zu setzten
 +
if ((i % j) == 0) {
 
isPrimzahl = false;
 
isPrimzahl = false;
 
}
 
}
 
}
 
}
//gib eine Meldung aus falls es sich um eine Primzahl handelt.
+
// gib eine Meldung aus falls es sich um eine Primzahl handelt.
if(isPrimzahl){
+
if (isPrimzahl) {
System.out.println(i+" ist eine Primzahl!");
+
System.out.println(i + " ist eine Primzahl!");
 
}
 
}
 
}
 
}
 
}
 
}
 
}
 
}
</nowiki>
+
</pre>
  
 
== Lösung: Optimierter Primzahlfinder ==
 
== Lösung: Optimierter Primzahlfinder ==
  
/**
+
<pre>
  * @author Theresa (theresa@freitagsrunde.org)
+
/**
  *
+
* @author Theresa (theresa@freitagsrunde.org)
  */
+
*  
+
*/
import java.util.Scanner;
+
public class PrimesAdvanced {
public class PrimzahlenOptimiert {
+
 
+
public static void main(String[] args) {
    public static void main(String[] args) {
+
int biswieviel, von; // Obere und untere Grenze der Primzahlkandidaten
        int biswieviel, von; // Obere und untere Grenze der Primzahlkandidaten
+
int i, n; // Variablen fuer aktuellen Primzahlkandidaten und aktuellen
        int i, n; // Variablen fuer aktuellen Primzahlkandidaten und aktuellen Teiler
+
// Teiler
+
 
        System.out.println("Bitte geben Sie den Bereich an, in dem alle Primzahlen berechnet werden sollen.");
+
System.out.println("Bitte geben Sie den Bereich an, in dem alle Primzahlen berechnet werden sollen.");
        Scanner tastatur = new Scanner(System.in);
+
System.out.print("Primzahlen von? ");
        System.out.print("Primzahlen von?");
+
// Lies die erste eingegebene Zahl
        // Lies die erste eingegebene Zahl
+
von = Integer.parseInt(System.console().readLine());
        von = tastatur.nextInt();
+
System.out.print("bis? ");
        System.out.print("bis?");
+
// Lies die zweite eingegebene Zahl
        // Lies die zweite eingegebene Zahl
+
biswieviel = Integer.parseInt(System.console().readLine());
        biswieviel = tastatur.nextInt();
+
 
       
+
for (i = von; i <= biswieviel; i++) {
        for (i = von; i <= biswieviel; i++ ) {
+
n = 2;
            n = 2;
+
 
           
+
// Schleife ueber alle moeglichen Teiler n des Primzahlkandidaten i:
            // Schleife ueber alle moeglichen Teiler n des Primzahlkandidaten i:  
+
while (i % n != 0 && n <= i / 2) {
            while (i % n != 0 && n <= i/2) {
+
// Erhoehe n solange, wie i nicht nurch n teilbar ist und die
                // Erhoehe n solange, wie i nicht nurch n teilbar ist und die Obergrenze noch nicht erreicht ist    
+
// Obergrenze noch nicht erreicht ist
                n = n + 1;
+
n = n + 1;
            }
+
}
           
+
 
            // Falls die Schleife bis zur Obergrenze i/2 durchlaufen wurde:
+
// Falls die Schleife bis zur Obergrenze i/2 durchlaufen wurde:
            if (n >= i/2 + 1 && i != 1) {
+
if (n >= i / 2 + 1 && i != 1) {
                System.out.println(i + " ist eine Primzahl.");
+
System.out.println(i + " ist eine Primzahl.");
            }
+
}
        // andernfalls wurde die Schleife vorher abgebrochen, weil i durch n teilbar war -> keine Primzahl
+
// andernfalls wurde die Schleife vorher abgebrochen, weil i durch n
        }
+
// teilbar war -> keine Primzahl
    }
+
}
}
+
}
 +
}
 +
</pre>
  
 
== Kommentare ==
 
== Kommentare ==
 
Wenn du Anmerkungen zur Aufgabe hast oder Lob und Kritik loswerden möchtest, ist hier die richtige Stelle dafür. Klicke einfach ganz rechts auf "bearbeiten" und schreibe deinen Kommentar direkt ins Wiki. Keine Scheu, es geht nichts kaputt ;)
 
Wenn du Anmerkungen zur Aufgabe hast oder Lob und Kritik loswerden möchtest, ist hier die richtige Stelle dafür. Klicke einfach ganz rechts auf "bearbeiten" und schreibe deinen Kommentar direkt ins Wiki. Keine Scheu, es geht nichts kaputt ;)
 
 
<!--
 
Als kleine Starthilfe folgt ein Beispiel, wie so ein Kommentar formatiert sein könnte. Mit "Vorschau zeigen" kannst du dir ansehen, was deine Änderung bewirken würde, ohne wirklich etwas zu ändern.
 
Du musst übrigens außerhalb dieses auskommentieren Bereichs schreiben ;)
 
-->
 

Aktuelle Version vom 27. Februar 2013, 17:04 Uhr

Hinweis: Die Musterlösung kann von eurer Lösung abweichen, da es immer mehrere Varianten gibt ein Problem zu lösen. Im Zweifelsfall Fragt einen Tutor.

Lösung: Einfacher Primzahlfinder

public class PrimesSimple {
	public static void main(String[] args) {
		// Grenze bis zu der Primzahlen gesucht werden
		int n = 10;
		// beginne bei der Zahl 2 da 1 keine Primzahl ist
		for (int i = 2; i <= n; i++) {
			// isPrimzahl ist ein Wahrheitswert, um zu überprüfen ob wir eine
			// Primzahl gefunden haben. falls nicht wird sie später auf false
			// gesetzt.
			boolean isPrimzahl = true;
			// i durch jede Zahl kleiner als i zu teilen und zu überprüfen, ob
			// ein Rest übrig bleibt. BSP. im wiki 25=i und j wäre die Variable
			// die hochgezählt wird
			for (int j = 2; j < i && isPrimzahl; j++) {
				// Wenn eine division als rest 0 hat dann ist die Zahl keine
				// Primzahl und somit ist isPrimzahl auf false zu setzten
				if ((i % j) == 0) {
					isPrimzahl = false;
				}
			}
			// gib eine Meldung aus falls es sich um eine Primzahl handelt.
			if (isPrimzahl) {
				System.out.println(i + " ist eine Primzahl!");
			}
		}
	}
}

Lösung: Optimierter Primzahlfinder

/**
 * @author Theresa (theresa@freitagsrunde.org)
 * 
 */
public class PrimesAdvanced {

	public static void main(String[] args) {
		int biswieviel, von; // Obere und untere Grenze der Primzahlkandidaten
		int i, n; // Variablen fuer aktuellen Primzahlkandidaten und aktuellen
					// Teiler

		System.out.println("Bitte geben Sie den Bereich an, in dem alle Primzahlen berechnet werden sollen.");
		System.out.print("Primzahlen von? ");
		// Lies die erste eingegebene Zahl
		von = Integer.parseInt(System.console().readLine());
		System.out.print("bis? ");
		// Lies die zweite eingegebene Zahl
		biswieviel = Integer.parseInt(System.console().readLine());

		for (i = von; i <= biswieviel; i++) {
			n = 2;

			// Schleife ueber alle moeglichen Teiler n des Primzahlkandidaten i:
			while (i % n != 0 && n <= i / 2) {
				// Erhoehe n solange, wie i nicht nurch n teilbar ist und die
				// Obergrenze noch nicht erreicht ist
				n = n + 1;
			}

			// Falls die Schleife bis zur Obergrenze i/2 durchlaufen wurde:
			if (n >= i / 2 + 1 && i != 1) {
				System.out.println(i + " ist eine Primzahl.");
			}
			// andernfalls wurde die Schleife vorher abgebrochen, weil i durch n
			// teilbar war -> keine Primzahl
		}
	}
}

Kommentare

Wenn du Anmerkungen zur Aufgabe hast oder Lob und Kritik loswerden möchtest, ist hier die richtige Stelle dafür. Klicke einfach ganz rechts auf "bearbeiten" und schreibe deinen Kommentar direkt ins Wiki. Keine Scheu, es geht nichts kaputt ;)