Ich habe gesehen, dass eine solche Funktion existiert für BigInteger
, dh BigInteger#gcd
. Gibt es noch andere Funktionen in Java , die auch Arbeit für andere Arten ( int
, long
oder Integer
)? Es scheint, dass dies sinnvoll wäre java.lang.Math.gcd
(bei allen Arten von Überlastungen), aber es ist nicht da. Ist es woanders?
(Verwechseln Sie diese Frage bitte nicht mit "Wie implementiere ich das selbst?")
java
greatest-common-divisor
Albert
quelle
quelle
Antworten:
Für int und long, als Primitive, nicht wirklich. Für Integer ist es möglich, dass jemand eine geschrieben hat.
Da BigInteger eine (mathematisch / funktionale) Obermenge von int, Integer, long und Long ist, konvertieren Sie diese Typen in eine BigInteger, führen Sie die GCD durch und konvertieren Sie das Ergebnis zurück.
quelle
BigInteger.valueOf(a).gcd(BigInteger.valueOf(b)).intValue()
ist viel besser.Soweit ich weiß, gibt es keine eingebaute Methode für Grundelemente. Aber so etwas Einfaches sollte den Trick machen:
Sie können es auch einzeilig machen, wenn Sie sich für so etwas interessieren:
Es ist zu beachten, dass es absolut keinen Unterschied zwischen den beiden gibt, da sie mit demselben Bytecode kompiliert werden.
quelle
Oder der euklidische Algorithmus zur Berechnung der GCD ...
quelle
Verwenden Sie Guave
LongMath.gcd()
undIntMath.gcd()
quelle
Wenn ich keine Guave habe, definiere ich Folgendes:
quelle
Jakarta Commons Math hat genau das.
ArithmeticUtils.gcd (int p, int q)
quelle
Sie können diese Implementierung des binären GCD-Algorithmus verwenden
}}
Von http://introcs.cs.princeton.edu/java/23recursion/BinaryGCD.java.html
quelle
Einige Implementierungen funktionieren hier nicht richtig, wenn beide Zahlen negativ sind. gcd (-12, -18) ist 6, nicht -6.
Es sollte also ein absoluter Wert zurückgegeben werden, so etwas wie
quelle
a
undb
sindInteger.MIN_VALUE
, erhalten SieInteger.MIN_VALUE
als Ergebnis zurück, was negativ ist. Dies kann akzeptabel sein. Das Problem ist, dass gcd (-2 ^ 31, -2 ^ 31) = 2 ^ 31 ist, aber 2 ^ 31 nicht als ganze Zahl ausgedrückt werden kann.if(a==0 || b==0) return Math.abs(a+b);
damit das Verhalten für Nullargumente wirklich symmetrisch ist.Wir können die rekursive Funktion verwenden, um gcd zu finden
quelle
Wenn Sie Java 1.5 oder höher verwenden, handelt es sich um einen iterativen binären GCD-Algorithmus, mit
Integer.numberOfTrailingZeros()
dem die Anzahl der erforderlichen Überprüfungen und Iterationen verringert wird.Gerätetest:
quelle
Diese Methode verwendet den Euklid-Algorithmus, um den "größten gemeinsamen Teiler" von zwei ganzen Zahlen zu erhalten. Es empfängt zwei ganze Zahlen und gibt deren gcd zurück. so einfach!
quelle
Apache!- es hat sowohl gcd als auch lcm, also cool!
Aufgrund der Tiefe ihrer Implementierung ist sie jedoch langsamer als eine einfache handgeschriebene Version (falls es darauf ankommt).
quelle
quelle
Ich habe diese Methode verwendet, die ich mit 14 Jahren erstellt habe.
quelle
Die von Commons-Math und Guava bereitgestellten GCD-Funktionen weisen einige Unterschiede auf.
ArithematicException.class
nur fürInteger.MIN_VALUE
oderLong.MIN_VALUE
.IllegalArgumentException.class
für alle negativen Werte.quelle
Die% geben uns die gcd Zwischen zwei Zahlen bedeutet dies: -% oder mod von big_number / small_number sind = gcd, und wir schreiben es so auf Java
big_number % small_number
.EX1: für zwei ganze Zahlen
EX2: für drei ganze Zahlen
quelle
gcd(42, 30)
sollte es sein,6
aber es ist12
durch Ihr Beispiel. Aber 12 ist kein Teiler von 30 und keiner von 42. Sie solltengcd
rekursiv aufrufen . Sehen Sie sich die Antwort von Matt an oder suchen Sie in Wikipedia nach dem euklidischen Algorithmus.