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.
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;
}
}
//Eingang
390 273
//Ausgabe
39
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".
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;
}
}
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
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.
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.
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;
}
}
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
Recommended Posts