Ich habe versucht, die Methode der gegenseitigen Teilung von Eugrid in Java zu implementieren

Was ist die euklidische Methode der gegenseitigen Teilung?

Ein Algorithmus, der die maximalen Versprechen von zwei natürlichen Zahlen findet.

Einfach gesagt

a % b = r
b % r = s
r % s = 0

In Form von ist die zu teilende Zahl die nächste zu teilende Zahl, und der Rest ist die nächste zu teilende Zahl, und dies wird rekursiv wiederholt. Die zu teilende Zahl, wenn der Rest 0 wird (s im obigen Beispiel), ist die maximale Verpflichtung der natürlichen Zahlen a und b.

Referenz Beweis der euklidischen gegenseitigen Teilung und unbestimmten Gleichung | Schöne Geschichte der Mathematik der High School

Ich habe versucht zu implementieren

package com.company;

import java.io.*;

class Main {
    public static void main(String[] args) {
        try {
            BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(System.in));
            String[] str = bufferedReader.readLine().split(" ");
            int x = Integer.parseInt(str[0]);
            int y = Integer.parseInt(str[1]);

            System.out.println(getCommonDivisor(x, y));

        } catch (Exception e) {
            System.out.println(e);
        }
    }

    private static int getCommonDivisor(int x, int y) {
        int biggerNum = Math.max(x, y);
        int smallerNum = Math.min(x, y);

        //Finden Sie den Rest der Trennung des kleineren vom größeren
        int surplus = biggerNum % smallerNum;

        //Wenn es teilbar ist, geben Sie es zurück
        if (surplus == 0) {
            return smallerNum;
        }
        //Wenn es nicht teilbar ist, fordert es rekursiv Vertrauen
        surplus = getCommonDivisor(smallerNum, surplus);

        return surplus;
    }
}

Ausprobieren

//Eingang
390 273 

//Ausgabe
39

Nachtrag (23. Juni 2017)

Der obige Code hat ursprünglich nicht tief über Eingaben usw. nachgedacht, sondern nur den Algorithmus implementiert, sodass die Ausnahmebehandlung usw. nicht berücksichtigt wird, und er fällt leicht ab.

Daher habe ich einen neuen Code geschrieben, der den von @ saka1029 erhaltenen Kommentar widerspiegelt. Vielen Dank, @ saka1029.

Dieses Mal wird der Code unter den folgenden Bedingungen geschrieben.

Negative Zahlen werden am Eingang mit der Implementierung der euklidischen gegenseitigen Teilung umgedreht.

Selbst wenn etwas anderes als Zahlen eingegeben wird, wird es nicht fallen gelassen

Darüber hinaus gibt es Schulen, die 0 in natürlichen Zahlen enthalten, und Schulen, die 0 nicht in natürlichen Zahlen enthalten. Dieses Mal werden wir jedoch "Schulen übernehmen, die 0 nicht in natürlichen Zahlen enthalten".

Code, der die Ausnahme behandelt hat

package com.company;

import java.io.*;

class Main {
    private static int x = -1;
    private static int y = -1;
    private static final String caution = "Bitte geben Sie zwei natürliche Zahlen ein, die durch Leerzeichen halber Breite getrennt sind.(0 ist jedoch natürlich nicht in diesem Programm enthalten.)";

    public static void main(String[] args) {
        System.out.println(caution);
        readInput();
        System.out.println(doEuclideanAlgorithm(x, y));
    }

    private static void readInput() {
        try {
            while (x <= 0 || y <= 0) {
                BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(System.in));
                String[] str = bufferedReader.readLine().split(" ");
                x = Integer.parseInt(str[0]);
                y = Integer.parseInt(str[1]);
                if (x <= 0 || y <= 0) {
                    System.out.println("Die Eingabe ist falsch." + caution);
                }
            }
        } catch (Exception e) {
            System.out.println("Die Eingabe ist falsch." + caution);
            readInput();
        }
    }

    private static int doEuclideanAlgorithm(int x, int y) {
        int biggerNum = Math.max(x, y);
        int smallerNum = Math.min(x, y);

        //Finden Sie den Rest der Trennung des kleineren vom größeren
        int surplus = biggerNum % smallerNum;

        //Wenn es teilbar ist, geben Sie es zurück
        if (surplus == 0) {
            return smallerNum;
        }
        //Wenn es nicht teilbar ist, fordert es rekursiv Vertrauen
        surplus = doEuclideanAlgorithm(smallerNum, surplus);

        return surplus;
    }
}

ich habe es versucht

Bitte geben Sie zwei natürliche Zahlen ein, die durch Leerzeichen halber Breite getrennt sind.(0 ist jedoch natürlich nicht in diesem Programm enthalten.)
a a
Die Eingabe ist falsch. Bitte geben Sie zwei natürliche Zahlen ein, die durch Leerzeichen halber Breite getrennt sind.(0 ist jedoch natürlich nicht in diesem Programm enthalten.)
390 0
Die Eingabe ist falsch. Bitte geben Sie zwei natürliche Zahlen ein, die durch Leerzeichen halber Breite getrennt sind.(0 ist jedoch natürlich nicht in diesem Programm enthalten.)
0 273 
Die Eingabe ist falsch. Bitte geben Sie zwei natürliche Zahlen ein, die durch Leerzeichen halber Breite getrennt sind.(0 ist jedoch natürlich nicht in diesem Programm enthalten.)
-390 273
Die Eingabe ist falsch. Bitte geben Sie zwei natürliche Zahlen ein, die durch Leerzeichen halber Breite getrennt sind.(0 ist jedoch natürlich nicht in diesem Programm enthalten.)
390 -273
Die Eingabe ist falsch. Bitte geben Sie zwei natürliche Zahlen ein, die durch Leerzeichen halber Breite getrennt sind.(0 ist jedoch natürlich nicht in diesem Programm enthalten.)
390 273 
39

Andere

Wenn Sie etwas wie "Es ist seltsam hier" oder "Ich kann es schlauer machen" haben, würde ich es begrüßen, wenn Sie einen Kommentar abgeben könnten.

Weitere Hinweise (23. Juni 2017)

Wie Sie in @ howdy39s Kommentar gesagt haben, gab es einige Feinheiten. Vielen Dank, @ howdy39. Hier ist der intelligente Code, der den Punkt von @ howdy39 übernommen hat.

Ich brauchte keine while-Anweisung, da ich readInput () rekursiv ausführte, wenn es eine Ausnahme gab.

Implementierung

package com.company;

import java.io.*;

class Main {
    private static final String caution = "Bitte geben Sie zwei natürliche Zahlen ein, die durch Leerzeichen halber Breite getrennt sind.(0 ist jedoch natürlich nicht in diesem Programm enthalten.)";

    public static void main(String[] args) {
        System.out.println(caution);
        int[] inputs = readInput();
        System.out.println(doEuclideanAlgorithm(inputs[0], inputs[1]));
    }

    private static int[] readInput() {
        try {
            BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(System.in));
            String[] str = bufferedReader.readLine().split(" ");
            int x = Integer.parseInt(str[0]);
            int y = Integer.parseInt(str[1]);
            if (x <= 0 || y <= 0) {
                throw new Exception("");
            }
            return new int[]{x, y};
        } catch (Exception e) {
            System.out.println("Die Eingabe ist falsch." + caution);
            return readInput();
        }
    }

    private static int doEuclideanAlgorithm(int x, int y) {
        int biggerNum = Math.max(x, y);
        int smallerNum = Math.min(x, y);

        //Finden Sie den Rest der Trennung des kleineren vom größeren
        int surplus = biggerNum % smallerNum;

        //Wenn es teilbar ist, geben Sie es zurück
        if (surplus == 0) {
            return smallerNum;
        }
        //Wenn es nicht teilbar ist, fordert es rekursiv Vertrauen
        surplus = doEuclideanAlgorithm(smallerNum, surplus);

        return surplus;
    }
}

Ausführungsergebnis

Bitte geben Sie zwei natürliche Zahlen ein, die durch Leerzeichen halber Breite getrennt sind.(0 ist jedoch natürlich nicht in diesem Programm enthalten.)
a a 
Die Eingabe ist falsch. Bitte geben Sie zwei natürliche Zahlen ein, die durch Leerzeichen halber Breite getrennt sind.(0 ist jedoch natürlich nicht in diesem Programm enthalten.)
390 0
Die Eingabe ist falsch. Bitte geben Sie zwei natürliche Zahlen ein, die durch Leerzeichen halber Breite getrennt sind.(0 ist jedoch natürlich nicht in diesem Programm enthalten.)
0 273 
Die Eingabe ist falsch. Bitte geben Sie zwei natürliche Zahlen ein, die durch Leerzeichen halber Breite getrennt sind.(0 ist jedoch natürlich nicht in diesem Programm enthalten.)
-390 273
Die Eingabe ist falsch. Bitte geben Sie zwei natürliche Zahlen ein, die durch Leerzeichen halber Breite getrennt sind.(0 ist jedoch natürlich nicht in diesem Programm enthalten.)
390 -273
Die Eingabe ist falsch. Bitte geben Sie zwei natürliche Zahlen ein, die durch Leerzeichen halber Breite getrennt sind.(0 ist jedoch natürlich nicht in diesem Programm enthalten.)
390 273
39

Die Seite, die ich als Referenz verwendet habe

Beweis der euklidischen gegenseitigen Teilung und unbestimmten Gleichung | Schöne Geschichte der Mathematik der High School

Recommended Posts

Ich habe versucht, die Methode der gegenseitigen Teilung von Eugrid in Java zu implementieren
Ich habe versucht, die Firebase-Push-Benachrichtigung in Java zu implementieren
Implementieren Sie den Algorithmus in Ruby: Tag 1 - Europäische gegenseitige Teilung -
Ich habe das neue Yuan-Problem in Java ausprobiert
Ich habe versucht, das Iterator-Muster zu implementieren
Ich habe versucht, polymorph in Nogizaka zu implementieren.
Ich habe versucht, die Sitzung in Rails zu organisieren
Ich habe versucht, neunundneunzig in Java auszugeben
Ich habe versucht, Alexa-Fähigkeiten mit Java zu erstellen
Ich habe versucht, Metaprogrammierung mit Java
Ich habe versucht, TCP / IP + BIO mit JAVA zu implementieren
# 2 [Anmerkung] Ich habe versucht, neunundneunzig mit Java zu berechnen.
Ich habe versucht, eine Clova-Fähigkeit in Java zu erstellen
Ich habe versucht, eine Anmeldefunktion mit Java zu erstellen
Ich habe versucht, Sterling Sort mit Java Collector zu implementieren
[Java] Ich habe versucht, die Yahoo API-Produktsuche zu implementieren
~ Ich habe jetzt versucht, funktionale Programmierung mit Java zu lernen ~
Ich habe versucht herauszufinden, was sich in Java 9 geändert hat
Ich habe versucht, mit Java zu interagieren
Ich habe versucht, die Methode zu erklären
Ich habe das Java-Framework "Quarkus" ausprobiert.
Ich habe versucht, JWT in Java zu verwenden
Ich habe versucht, das Java-Lernen zusammenzufassen (1)
Versuchen Sie, Yuma in Java zu implementieren
Ich habe jetzt versucht, Java 8 zusammenzufassen
Ich habe versucht, die ähnliche Funktion durch asynchrone Kommunikation zu implementieren
[JDBC] Ich habe versucht, von Java aus auf die SQLite3-Datenbank zuzugreifen.
Ich habe versucht, die Grundlagen von Kotlin und Java zusammenzufassen
Ich habe versucht, in Java von einer Zeichenfolge in einen LocalDate-Typ zu konvertieren
Ich habe versucht, Dapr in Java zu verwenden, um die Entwicklung von Mikroservices zu erleichtern
Ich habe versucht, eine Webanwendung voller Fehler mit Kotlin zu implementieren
Ich habe einen RESAS-API-Client in Java erstellt
Ich möchte die if-else-Anweisung für bedingte Verzweigungen in Java vereinfachen
Ich habe versucht, die Elasticsearch-API in Java zu verwenden
So implementieren Sie den Kalman-Filter mit Java
Ich habe versucht, die verwendeten Methoden zusammenzufassen
Ich habe mir die Rosen von Versailles angesehen und versucht, das Schlusslied in Java zu reproduzieren
Ich habe versucht, den Weihnachtsbaum in einem Lebensspiel zu beleuchten
Java-Referenz zum Verständnis in der Abbildung
Versuchen Sie, n-ary Addition in Java zu implementieren
Daten sortieren Absteigend, aufsteigend / Schienen
Ich habe versucht, die Bildvorschau mit Rails / jQuery zu implementieren
Ich habe versucht, Java-Anfänger so einzustellen, dass sie Tastenkombinationen in Eclipse verwenden
Ich habe versucht, die Fehlermeldung beim Ausführen von Eclipse (Java) zu übersetzen.
So erhalten Sie das Datum mit Java
Ich habe versucht, die Stream-API zusammenzufassen
Ich habe versucht, die Methoden von Java String und StringBuilder zusammenzufassen
Ich habe die AutoValue-Bibliothek mit Intellij ausprobiert
[Java] Ich möchte mit dem Schlüssel im Objekt eindeutig arbeiten
Ich habe versucht, das Java-kompatible FaaS-Formular "Fn Project" auszuführen.
Ich habe versucht, den Kalender mit Java auf der Eclipse-Konsole anzuzeigen.
[Einführung in Java] Ich habe versucht, das Wissen zusammenzufassen, das ich für wesentlich halte
Ich habe versucht, das Problem der Tribonacci-Sequenz in Ruby mit Wiederholung zu lösen.
Ich habe die COTOHA-API-Syntaxanalyse 100 Mal in Java aufgerufen, um die Leistung zu messen.
Ich möchte die IP-Adresse erhalten, wenn ich mit Java eine Verbindung zu Wi-Fi herstelle
Ich habe versucht, mit AI "A3RT" eine Talk-App in Java zu erstellen.