He visto que existe tal función para BigInteger
, es decir BigInteger#gcd
. ¿Hay otras funciones en Java que también funcionen para otros tipos ( int
, long
o Integer
)? Parece que esto tendría sentido como java.lang.Math.gcd
(con todo tipo de sobrecargas) pero no está ahí. ¿Está en otro lugar?
(¡No confunda esta pregunta con "cómo implemento esto yo mismo", por favor!)
java
greatest-common-divisor
Albert
fuente
fuente
Respuestas:
Por int y long, como primitivos, no realmente. Para Integer, es posible que alguien haya escrito uno.
Dado que BigInteger es un superconjunto (matemático / funcional) de int, Integer, long y Long, si necesita usar estos tipos, conviértalos a BigInteger, haga el GCD y vuelva a convertir el resultado.
fuente
BigInteger.valueOf(a).gcd(BigInteger.valueOf(b)).intValue()
es mucho mejor.Hasta donde yo sé, no hay ningún método incorporado para primitivas. Pero algo tan simple como esto debería funcionar:
También puede agregar una línea si le gustan ese tipo de cosas:
Cabe señalar que no hay absolutamente ninguna diferencia entre los dos, ya que se compilan en el mismo código de bytes.
fuente
O el algoritmo euclidiano para calcular el MCD ...
fuente
Usa guayaba
LongMath.gcd()
yIntMath.gcd()
fuente
A menos que tenga Guayaba, defino así:
fuente
Jakarta Commons Math tiene exactamente eso.
ArithmeticUtils.gcd (int p, int q)
fuente
Puede utilizar esta implementación del algoritmo Binary GCD
}
De http://introcs.cs.princeton.edu/java/23recursion/BinaryGCD.java.html
fuente
Algunas implementaciones aquí no funcionan correctamente si ambos números son negativos. gcd (-12, -18) es 6, no -6.
Entonces se debe devolver un valor absoluto, algo como
fuente
a
y lob
sonInteger.MIN_VALUE
, obtendrásInteger.MIN_VALUE
como resultado, que es negativo. Esto puede ser aceptable. El problema es que mcd (-2 ^ 31, -2 ^ 31) = 2 ^ 31, pero 2 ^ 31 no se puede expresar como un número entero.if(a==0 || b==0) return Math.abs(a+b);
para que el comportamiento sea verdaderamente simétrico para cero argumentos.podemos usar la función recursiva para encontrar gcd
fuente
Si está utilizando Java 1.5 o posterior, este es un algoritmo GCD binario iterativo que se utiliza
Integer.numberOfTrailingZeros()
para reducir el número de comprobaciones e iteraciones necesarias.Prueba de unidad:
fuente
Este método usa el algoritmo de Euclides para obtener el "Divisor común más grande" de dos números enteros. Recibe dos enteros y devuelve el mcd de ellos. ¡así de fácil!
fuente
¡Apache!- tiene gcd y lcm, ¡genial!
Sin embargo, debido a la profundidad de su implementación, es más lento en comparación con la versión simple escrita a mano (si es que importa).
fuente
fuente
Usé este método que creé cuando tenía 14 años.
fuente
Esas funciones GCD proporcionadas por Commons-Math y Guava tienen algunas diferencias.
ArithematicException.class
solo paraInteger.MIN_VALUE
oLong.MIN_VALUE
.IllegalArgumentException.class
valor negativo.fuente
El% que nos va a dar el gcd Entre dos números, significa: -% o mod de big_number / small_number are = gcd, y lo escribimos en java así
big_number % small_number
.EX1: para dos enteros
EX2: para tres enteros
fuente
gcd(42, 30)
debería serlo,6
pero es12
por su ejemplo. Pero 12 no es divisor de 30 ni tampoco de 42. Debería llamar de formagcd
recursiva. Vea la respuesta de Matt o busque en Wikipedia el algoritmo euclidiano.