Java :: Aufgabe #8
6 Lösungen

Euklidischer Algorithmus
Anfänger - Java
von Jurom
- 23.10.2012 um 11:49 Uhr
Erstellen Sie ein Programm, das den größten gemeinsamen Teiler zweier natürlicher Zahlen zurückgibt.
Benutzen Sie hierzu den euklidischen Algorithmus; sowohl den klassischen, als auch den modernen.
Geben Sie zum Vergleich beide Lösungen aus.
Auf ein Exception-Handling kann verzichtet werden.
Beispiele zum Lösungslayout sind beigefügt.
Benutzen Sie hierzu den euklidischen Algorithmus; sowohl den klassischen, als auch den modernen.
Geben Sie zum Vergleich beide Lösungen aus.
Auf ein Exception-Handling kann verzichtet werden.
Beispiele zum Lösungslayout sind beigefügt.
Lösungen:

//©2012 by Julius J. Hoffmann //written with Eclipse import java.util.*; //Importiert Scanner zum Einlesen der Eingabe public class Euklid { //die "ausführende" Klasse static int old(int a, int b) //Methode zur Berechnung des klass. Algorithmus { //mit Übergabe von 2 int-Variablen if (a==0) return b; //Bedingung: a = 0 -> Rückgabe b; Ende der Methode while (b!=0) //Initiierung einer while-Schleife mit b nicht 0 als Bedingung { if (a > b) a = a-b; //Subtraktion der kleinern von der kleineren Zahl, wenn a größer else b = b-a; //wenn b kleiner, iterative Berechnung } return a; //Rückgabe a (wenn b = 0) } static int modern (int a, int b) //Methode zur Berechnung des modernen Algorithmus { if (b==0) return a; //wenn b = 0, Rückgabe a; Ende der Methode return modern(b, a%b); //rekursiver Aufruf der Funktion, mit b, Rest von a/b } public static void main(String[] args) //main-Methode { Scanner s = new Scanner(System.in); //Anlegen des Scanner-Objektes System.out.print("Geben Sie die 1. natürliche Zahl an: "); //Ausgabe des Strings int x = s.nextInt(); //Einlesen der Benutzereingabe System.out.print("Geben Sie die 2. natürliche Zahl an: "); //Ausgabe des Strings int y = s.nextInt(); //Einlesen der Benutzereingabe System.out.println("alter Euklid: " + old(x,y)); //Ausgabe String, Aufruf von old() System.out.print("moderner Euklid: " + modern(x,y)); //Ausgabe String, Aufruf von modern } }

import java.util.Scanner; public class EuklidAlg { static Scanner sc; static int a, b; public static void main(String[] args) { sc = new Scanner(System.in); System.out.println("Bitte erste Zahl eingeben."); a = sc.nextInt(); System.out.println("Bitte zweite Zahl eingeben."); b = sc.nextInt(); System.out.println("a: " + a + "\n" + "b: " + b); int ggTold = euklidOld(a, b); System.out.println("Ergebnis klassischer Algorithmus: " + ggTold); int ggTnew = euklidNew(a, b); System.out.println("Ergebnis moderner Algorithmus: " + ggTnew); } public static int euklidOld(int a, int b) { if(a == 0) { return b; } else { while(b != 0) { if(a > b) { a = a - b; } else { b = b - a; } } } return a; } public static int euklidNew(int a, int b) { if(b == 0) { return a; } else { return euklidNew(b, a % b); } } }

[CODE]package ÜbungsAufgaben; import javax.swing.JOptionPane; public class Aufgabe08 { public static void main(String[] args) { Aufgabe08 m = new Aufgabe08(); int zahl1 = Integer.parseInt(JOptionPane .showInputDialog("Eingabe der ersten Zahl:"));// Aufnahme der ersten zu teilenden Zahl. int zahl2 = Integer.parseInt(JOptionPane .showInputDialog("Eingabe der zweiten Zahl:"));// Aufnahme der zweiten zu teilenden Zahl. JOptionPane.showMessageDialog( null, "ggT nach dem klassen Euklidischen Algorithmus: " + m.klassischerAlgorithmus(zahl1, zahl2));// Ausgabe des ggT nach klassischer Art. JOptionPane.showMessageDialog( null, "ggT nach dem modernen Euklidischen Algorithmus: " + m.modernerAlgorithmus(zahl1, zahl2));// Ausgabe des ggT nach moderner Art. } int klassischerAlgorithmus(int zahl1, int zahl2) { if (zahl1 == 0) { return zahl2; } else { while (zahl2 != 0) { if (zahl1 > zahl2) { zahl1 -= zahl2; } else { zahl2 -= zahl1; } } } return zahl1; } int modernerAlgorithmus(int zahl1, int zahl2) { int n; while (zahl2 != 0) { n = zahl1 % zahl2; zahl1 = zahl2; zahl2 = n; } return zahl1; } }[/CODE]
Die Lösung beinhaltet jedoch nur die moderne Variante.
Java-Code
Ausgabe:

/* @Author H.K. * @Date 22.02.2016 * * Programmbeschreibung: * Ermittlung des größten gemeinsamen Teiler durch den modernen Euklidischen Algorithmus */ import java.io.BufferedReader; import java.io.IOException; import java.io.InputStreamReader; public class mainprogram { public static void main ( String args[] ) throws IOException { System.out.println("--- Euklidischer Algorithmus ---"); System.out.println("--- Es werden zwei Ganze Zahlen abgefragt und der ggT von diesen ermittelt ---\n\n"); int zahl = 0; int ggT = 0; int a = 0; int b = 0; a = zahlenabfrage(zahl, a); zahl = 0; b = zahlenabfrage(zahl, a); ggT = ggT(a, b, ggT); } public static int zahlenabfrage(int zahl, int a) throws IOException { while (zahl == 0) { if (a == 0) { System.out.println("Bitte die erste Ganze Zahl eingeben: "); } else { System.out.println("Bitte die zweite Ganze Zahl eingeben: "); } BufferedReader input = new BufferedReader ( new InputStreamReader ( System.in ) ); String inputString = input.readLine(); if (inputString.matches("-?\\d+?")) { zahl = Integer.parseInt(inputString); } else { System.out.println("Eingabe ist keine Zahl!"); } } return zahl; } public static int ggT(int a, int b, int ggT) { int largernumber = 0; int smallernumber = 0; int rest = 1; int calcrest = rest; if (a > b) { largernumber = a; smallernumber = b; } else { largernumber = b; smallernumber = a; } while (rest != 0) { rest = largernumber%smallernumber; if (rest == 0) { System.out.println("Der ggT ist: " +calcrest); } else { calcrest = rest; largernumber = smallernumber; smallernumber = rest; } } return ggT; } }
Ausgabe:
Konsolenausgabe:
--- Euklidischer Algorithmus ---
--- Es werden zwei Ganze Zahlen abgefragt und der ggT von diesen ermittelt ---
Bitte die erste Ganze Zahl eingeben:
50250
Bitte die zweite Ganze Zahl eingeben:
80750
Der ggT ist: 250

import java.util.*; public class EuklidischerAlg { public static void main(String[] args) { Scanner scanner = new Scanner(System.in); int zahl1, zahl2, alt, neu; System.out.print("Erste natürliche Zahl:\t"); zahl1 = scanner.nextInt(); System.out.print("\nZweite natürliche Zahl:\t"); zahl2 = scanner.nextInt(); alt = eucleid_old(zahl1, zahl2); System.out.println("\nAlter Eukleid:\t" + alt); neu = eucleid_modern(zahl1, zahl2); System.out.println("\nModerner Eukleid:\t" + neu); scanner.close(); } public static int eucleid_old(int a, int b) { int erg; if (a == 0) erg = b; else { while(b != 0) { if(a > b) a = a - b; else b = b - a; } erg = a; } return erg; } public static int eucleid_modern(int a, int b) { int erg, h; while(b != 0) { h = a % b; a = b; b = h; } erg = a; return erg; } }

import java.awt.FlowLayout; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import javax.swing.JButton; import javax.swing.JFrame; import javax.swing.JLabel; import javax.swing.JPanel; import javax.swing.JTextArea; import javax.swing.JTextField; public class EuklidischerAlgorithmus { public static void main(String[] args) { FrEuklidischerAlg frEuklidischerAlg = new FrEuklidischerAlg("Euklidischer Algorithmus"); } } class FrEuklidischerAlg extends JFrame implements ActionListener { JLabel lblErsteZahl = new JLabel("erste Zahl: "); JTextField tfErsteZahl = new JTextField(15); JPanel pErsteZahl = new JPanel(); JLabel lblZweiteZahl = new JLabel("zweite Zahl: "); JTextField tfZweiteZahl = new JTextField(15); JPanel pZweiteZahl = new JPanel(); JButton bModern = new JButton(" Modern "); JButton bKlassisch = new JButton(" Klassisch "); JPanel pButton = new JPanel(); JTextArea taAusgabe = new JTextArea(20, 30); FrEuklidischerAlg(String titel) { super(titel); setVisible(true); setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); setSize(460, 600); setLocation(500, 200); setLayout(new FlowLayout(FlowLayout.RIGHT, 60, 25)); tfErsteZahl.setHorizontalAlignment(JTextField.RIGHT); tfZweiteZahl.setHorizontalAlignment(JTextField.RIGHT); taAusgabe.setEditable(false); taAusgabe.setLineWrap(true); taAusgabe.setWrapStyleWord(true); bModern.addActionListener(this); bModern.setActionCommand("modern"); bKlassisch.addActionListener(this); bKlassisch.setActionCommand("klassisch"); pErsteZahl.add(lblErsteZahl); pErsteZahl.add(tfErsteZahl); pZweiteZahl.add(lblZweiteZahl); pZweiteZahl.add(tfZweiteZahl); pButton.add(bModern); pButton.add(bKlassisch); add(pErsteZahl); add(pZweiteZahl); add(pButton); add(taAusgabe); } public String berechneModern(String stZahl1, String stZahl2) { String stAusgabe; StringBuilder sbAusgabe = new StringBuilder(); int rest = 1; int faktor; int temp; try { int zahl1 = Integer.parseInt(stZahl1); int zahl2 = Integer.parseInt(stZahl2); if (zahl1 == 0 || zahl2 == 0) { stAusgabe = "Es gibt keinen gemeinsamen Teiler"; return stAusgabe; } if (zahl2 > zahl1) { temp = zahl1; zahl1 = zahl2; zahl2 = temp; } sbAusgabe.append("ggT (" + zahl1 + ", " + zahl2 + ")" + "\n"); do { faktor = zahl1 / zahl2; rest = zahl1 % zahl2; sbAusgabe.append(zahl1 + " = " + faktor + "*" + zahl2 + "+" + rest + "\n"); zahl1 = zahl2; zahl2 = rest; } while (rest != 0); sbAusgabe.append("der größte gemeinsame Teiler: " + zahl1); stAusgabe = sbAusgabe.toString(); } catch (NumberFormatException e) { stAusgabe = "Bitte Ganzzahlen eingeben!"; } return stAusgabe; } public String berechneKlassisch(String stZahl1, String stZahl2) { String stAusgabe; StringBuilder sbAusgabe = new StringBuilder(); int differenz = 0; int temp; try { int zahl1 = Integer.parseInt(stZahl1); int zahl2 = Integer.parseInt(stZahl2); if (zahl1 == 0 || zahl2 == 0) { stAusgabe = "Es gibt keinen gemeinsamen Teiler"; return stAusgabe; } if (zahl2 > zahl1) { temp = zahl1; zahl1 = zahl2; zahl2 = temp; } sbAusgabe.append("ggT (" + zahl1 + ", " + zahl2 + ")"); do { sbAusgabe.append("\n" + zahl1); differenz = zahl1; do { sbAusgabe.append("-" + zahl2); differenz = differenz - zahl2; } while (differenz > zahl2); sbAusgabe.append("=" + differenz); zahl1 = zahl2; zahl2 = differenz; } while (differenz != 0); sbAusgabe.append("\n" + "der größte gemeinsame Teiler: " + zahl1); stAusgabe = sbAusgabe.toString(); } catch (NumberFormatException e) { stAusgabe = "Bitte Ganzzahlen eingeben!"; } return stAusgabe; } @Override public void actionPerformed(ActionEvent evt) { if (evt.getActionCommand().equals("modern")) taAusgabe.setText(berechneModern(tfErsteZahl.getText(), tfZweiteZahl.getText())); if (evt.getActionCommand().equals("klassisch")) taAusgabe.setText(berechneKlassisch(tfErsteZahl.getText(), tfZweiteZahl.getText())); } }