J'ai vu qu'une telle fonction existe pour BigInteger
, ie BigInteger#gcd
. Existe-t-il d'autres fonctions en Java qui fonctionnent également pour d'autres types ( int
, long
ou Integer
)? Il semble que cela aurait du sens java.lang.Math.gcd
(avec toutes sortes de surcharges), mais ce n'est pas là. Est-ce ailleurs?
(Ne confondez pas cette question avec "comment puis-je implémenter cela moi-même", s'il vous plaît!)
java
greatest-common-divisor
Albert
la source
la source
Réponses:
Pour int et long, comme primitifs, pas vraiment. Pour Integer, il est possible que quelqu'un en ait écrit un.
Étant donné que BigInteger est un sur-ensemble (mathématique / fonctionnel) de int, Integer, long et Long, si vous avez besoin d'utiliser ces types, convertissez-les en BigInteger, effectuez le GCD et reconvertissez le résultat.
la source
BigInteger.valueOf(a).gcd(BigInteger.valueOf(b)).intValue()
c'est beaucoup mieux.Autant que je sache, il n'y a pas de méthode intégrée pour les primitives. Mais quelque chose d'aussi simple que cela devrait faire l'affaire:
Vous pouvez également le mettre en ligne si vous aimez ce genre de choses:
Il convient de noter qu'il n'y a absolument aucune différence entre les deux car ils se compilent avec le même code d'octet.
la source
Ou l'algorithme euclidien de calcul du GCD ...
la source
Utilisez de la goyave
LongMath.gcd()
etIntMath.gcd()
la source
Sauf si j'ai de la goyave, je définis comme ceci:
la source
Jakarta Commons Math a exactement cela.
ArithmeticUtils.gcd (int p, int q)
la source
Vous pouvez utiliser cette implémentation de l' algorithme Binary GCD
}
Depuis http://introcs.cs.princeton.edu/java/23recursion/BinaryGCD.java.html
la source
Certaines implémentations ici ne fonctionnent pas correctement si les deux nombres sont négatifs. pgcd (-12, -18) vaut 6 et non -6.
Une valeur absolue doit donc être renvoyée, quelque chose comme
la source
a
etb
sontInteger.MIN_VALUE
, vous obtiendrezInteger.MIN_VALUE
le résultat, ce qui est négatif. Cela peut être acceptable. Le problème étant que pgcd (-2 ^ 31, -2 ^ 31) = 2 ^ 31, mais 2 ^ 31 ne peut pas être exprimé sous forme d'entier.if(a==0 || b==0) return Math.abs(a+b);
pour que le comportement soit vraiment symétrique pour zéro argument.nous pouvons utiliser la fonction récursive pour trouver gcd
la source
Si vous utilisez Java 1.5 ou version ultérieure, il s'agit d'un algorithme GCD binaire itératif qui permet
Integer.numberOfTrailingZeros()
de réduire le nombre de vérifications et d'itérations requises.Test de l'unité:
la source
Cette méthode utilise l'algorithme d'Euclid pour obtenir le "plus grand diviseur commun" de deux entiers. Il reçoit deux entiers et en renvoie le pgcd. aussi simple que cela!
la source
Apache!- il a à la fois pgcd et lcm, tellement cool!
Cependant, en raison de la profondeur de leur mise en œuvre, elle est plus lente par rapport à une simple version manuscrite (si cela compte).
la source
la source
J'ai utilisé cette méthode que j'ai créée quand j'avais 14 ans.
la source
Ces fonctions GCD fournies par Commons-Math et Guava présentent quelques différences.
ArithematicException.class
seul pourInteger.MIN_VALUE
ouLong.MIN_VALUE
.IllegalArgumentException.class
pour toutes les valeurs négatives.la source
Le% va nous donner le pgcd Entre deux nombres, ça veut dire: -% ou mod de big_number / small_number sont = gcd, et on l'écrit sur java comme ça
big_number % small_number
.EX1: pour deux entiers
EX2: pour trois entiers
la source
gcd(42, 30)
devrait être6
mais c'est12
par votre exemple. Mais 12 n'est pas un diviseur de 30 ni de 42. Vous devez appelergcd
récursivement. Voir la réponse de Matt ou chercher sur Wikipedia l'algorithme euclidien.