J'ai essayé d'implémenter la méthode de division mutuelle d'Eugrid en Java

Qu'est-ce que la méthode euclidienne de division mutuelle?

Un algorithme qui trouve le maximum de promesses de deux nombres naturels.

Pour le dire simplement

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

Sous la forme de, le nombre à diviser est le prochain nombre à diviser, et le reste est le prochain nombre à diviser, et ceci est répété de manière récursive. Le nombre à diviser lorsque le reste devient 0 (s dans l'exemple ci-dessus) est l'engagement maximum des nombres naturels a et b.

référence Preuve de la division mutuelle euclidienne et de l'équation indéfinie | Belle histoire de mathématiques au lycée

J'ai essayé de mettre en œuvre

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);

        //Trouvez le reste de la division du plus petit du plus grand
        int surplus = biggerNum % smallerNum;

        //S'il est divisible, retournez-le
        if (surplus == 0) {
            return smallerNum;
        }
        //S'il n'est pas divisible, il appelle récursivement à la confiance
        surplus = getCommonDivisor(smallerNum, surplus);

        return surplus;
    }
}

Essaie

//contribution
390 273 

//production
39

Postscript (23 juin 2017)

Le code ci-dessus à l'origine ne pensait pas profondément à l'entrée, etc., juste implémenté l'algorithme, donc il ne considère pas la gestion des exceptions, etc. et il tombe facilement.

Par conséquent, j'ai écrit un nouveau code qui reflète le commentaire reçu de @ saka1029. Merci, @ saka1029.

Cette fois, le code est écrit dans les conditions suivantes.

Les nombres négatifs sont retournés à l'entrée avec la mise en œuvre de la division mutuelle euclidienne.

Même si quelque chose d'autre que des nombres est entré, il ne tombera pas

De plus, il existe des écoles qui incluent 0 en nombres naturels et des écoles qui n'incluent pas 0 en nombres naturels, mais cette fois, nous adopterons des "écoles qui n'incluent pas 0 en nombres naturels".

Code qui a géré l'exception

package com.company;

import java.io.*;

class Main {
    private static int x = -1;
    private static int y = -1;
    private static final String caution = "Veuillez saisir deux nombres naturels séparés par des espaces demi-largeur.(Cependant, 0 n'est pas naturellement inclus dans ce programme.)";

    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("L'entrée est incorrecte." + caution);
                }
            }
        } catch (Exception e) {
            System.out.println("L'entrée est incorrecte." + caution);
            readInput();
        }
    }

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

        //Trouvez le reste de la division du plus petit du plus grand
        int surplus = biggerNum % smallerNum;

        //S'il est divisible, retournez-le
        if (surplus == 0) {
            return smallerNum;
        }
        //S'il n'est pas divisible, il appelle récursivement à la confiance
        surplus = doEuclideanAlgorithm(smallerNum, surplus);

        return surplus;
    }
}

J'ai essayé

Veuillez saisir deux nombres naturels séparés par des espaces demi-largeur.(Cependant, 0 n'est pas naturellement inclus dans ce programme.)
a a
L'entrée est incorrecte. Veuillez saisir deux nombres naturels séparés par des espaces demi-largeur.(Cependant, 0 n'est pas naturellement inclus dans ce programme.)
390 0
L'entrée est incorrecte. Veuillez saisir deux nombres naturels séparés par des espaces demi-largeur.(Cependant, 0 n'est pas naturellement inclus dans ce programme.)
0 273 
L'entrée est incorrecte. Veuillez saisir deux nombres naturels séparés par des espaces demi-largeur.(Cependant, 0 n'est pas naturellement inclus dans ce programme.)
-390 273
L'entrée est incorrecte. Veuillez saisir deux nombres naturels séparés par des espaces demi-largeur.(Cependant, 0 n'est pas naturellement inclus dans ce programme.)
390 -273
L'entrée est incorrecte. Veuillez saisir deux nombres naturels séparés par des espaces demi-largeur.(Cependant, 0 n'est pas naturellement inclus dans ce programme.)
390 273 
39

Autre

Si vous avez quelque chose comme "C'est étrange ici" ou "Je peux le rendre plus intelligent", je vous serais reconnaissant si vous pouviez commenter.

Notes complémentaires (23 juin 2017)

Comme vous l'avez dit dans le commentaire de @ howdy39, il y avait quelques subtilités. Merci, @ howdy39. Voici le code intelligent qui a adopté le point de @ howdy39.

Je n'avais pas besoin d'une instruction while car j'exécutais récursivement readInput () quand il y avait une exception.

la mise en oeuvre

package com.company;

import java.io.*;

class Main {
    private static final String caution = "Veuillez saisir deux nombres naturels séparés par des espaces demi-largeur.(Cependant, 0 n'est pas naturellement inclus dans ce programme.)";

    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("L'entrée est incorrecte." + caution);
            return readInput();
        }
    }

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

        //Trouvez le reste de la division du plus petit du plus grand
        int surplus = biggerNum % smallerNum;

        //S'il est divisible, retournez-le
        if (surplus == 0) {
            return smallerNum;
        }
        //S'il n'est pas divisible, il appelle récursivement à la confiance
        surplus = doEuclideanAlgorithm(smallerNum, surplus);

        return surplus;
    }
}

Résultat d'exécution

Veuillez saisir deux nombres naturels séparés par des espaces demi-largeur.(Cependant, 0 n'est pas naturellement inclus dans ce programme.)
a a 
L'entrée est incorrecte. Veuillez saisir deux nombres naturels séparés par des espaces demi-largeur.(Cependant, 0 n'est pas naturellement inclus dans ce programme.)
390 0
L'entrée est incorrecte. Veuillez saisir deux nombres naturels séparés par des espaces demi-largeur.(Cependant, 0 n'est pas naturellement inclus dans ce programme.)
0 273 
L'entrée est incorrecte. Veuillez saisir deux nombres naturels séparés par des espaces demi-largeur.(Cependant, 0 n'est pas naturellement inclus dans ce programme.)
-390 273
L'entrée est incorrecte. Veuillez saisir deux nombres naturels séparés par des espaces demi-largeur.(Cependant, 0 n'est pas naturellement inclus dans ce programme.)
390 -273
L'entrée est incorrecte. Veuillez saisir deux nombres naturels séparés par des espaces demi-largeur.(Cependant, 0 n'est pas naturellement inclus dans ce programme.)
390 273
39

Le site que j'ai utilisé comme référence

Preuve de la division mutuelle euclidienne et de l'équation indéfinie | Belle histoire de mathématiques au lycée

Recommended Posts

J'ai essayé d'implémenter la méthode de division mutuelle d'Eugrid en Java
J'ai essayé d'implémenter la notification push Firebase en Java
Implémenter l'algorithme dans Ruby: Jour 1 - Division mutuelle euclidienne-
J'ai essayé le nouveau yuan à Java
J'ai essayé d'implémenter le modèle Iterator
J'ai essayé d'implémenter des relations polymorphes à Nogizaka.
J'ai essayé d'organiser la session en Rails
J'ai essayé de sortir quatre-vingt-dix-neuf en Java
J'ai essayé de créer une compétence Alexa avec Java
J'ai essayé la métaprogrammation avec Java
J'ai essayé d'implémenter TCP / IP + BIO avec JAVA
# 2 [Note] J'ai essayé de calculer quatre-vingt-dix-neuf avec Java.
J'ai essayé de créer une compétence Clova en Java
J'ai essayé de créer une fonction de connexion avec Java
J'ai essayé d'implémenter Sterling Sort avec Java Collector
[Java] J'ai essayé de mettre en œuvre la recherche de produits de l'API Yahoo
~ J'ai essayé d'apprendre la programmation fonctionnelle avec Java maintenant ~
J'ai essayé de découvrir ce qui avait changé dans Java 9
J'ai essayé d'interagir avec Java
J'ai essayé d'expliquer la méthode
J'ai essayé le framework Java "Quarkus"
J'ai essayé d'utiliser JWT en Java
J'ai essayé de résumer l'apprentissage Java (1)
Essayez d'implémenter Yuma en Java
J'ai essayé de résumer Java 8 maintenant
J'ai essayé d'implémenter la fonction similaire par communication asynchrone
[JDBC] J'ai essayé d'accéder à la base de données SQLite3 depuis Java.
J'ai essayé de résumer les bases de kotlin et java
J'ai essayé de convertir une chaîne de caractères en un type LocalDate en Java
J'ai essayé d'utiliser Dapr en Java pour faciliter le développement de microservices
J'ai essayé d'implémenter une application web pleine de bugs avec Kotlin
J'ai créé un client RESAS-API en Java
Je souhaite simplifier l'instruction if-else de la branche conditionnelle en Java
J'ai essayé d'utiliser l'API Elasticsearch en Java
Comment implémenter le filtre de Kalman par Java
J'ai essayé de résumer les méthodes utilisées
J'ai fini de regarder les roses de Versailles, alors j'ai essayé de reproduire la chanson de fin en Java
J'ai essayé d'illuminer le sapin de Noël dans un jeu de la vie
Référence Java à comprendre dans la figure
Essayez d'implémenter l'ajout n-aire en Java
Tri des données Décroissant, croissant / Rails
J'ai essayé d'implémenter la fonction de prévisualisation d'image avec Rails / jQuery
J'ai essayé de configurer les débutants Java pour qu'ils utilisent des touches de raccourci dans eclipse
J'ai essayé de traduire le message d'erreur lors de l'exécution d'Eclipse (Java)
Comment obtenir la date avec Java
J'ai essayé de résumer l'API Stream
J'ai essayé de résumer les méthodes de Java String et StringBuilder
J'ai essayé la bibliothèque AutoValue avec Intellij
[Java] Je veux effectuer distinctement avec la clé dans l'objet
J'ai essayé d'exécuter le formulaire FaaS compatible Java "Fn Project"
J'ai essayé d'afficher le calendrier sur la console Eclipse en utilisant Java.
[Introduction à Java] J'ai essayé de résumer les connaissances que j'estime essentielles
J'ai essayé de résoudre le problème de la séquence Tribonacci en Ruby, avec récurrence.
J'ai appelé l'analyse de la syntaxe de l'API COTOHA 100 fois en Java pour mesurer les performances.
Je souhaite obtenir l'adresse IP lors de la connexion au Wi-Fi avec Java
J'ai essayé de créer une application de conversation en Java à l'aide de l'IA «A3RT»