Eu vi que essa função existe para BigInteger
, ou seja BigInteger#gcd
. Existem outras funções em Java que também trabalho para outros tipos ( int
, long
ou Integer
)? Parece que faria sentido java.lang.Math.gcd
(com todos os tipos de sobrecargas), mas não está lá. Está em outro lugar?
(Não confunda esta pergunta com "como faço para implementar isso sozinho", por favor!)
java
greatest-common-divisor
Albert
fonte
fonte
Respostas:
Por muito tempo, como primitivos, não realmente. Para Integer, é possível que alguém tenha escrito um.
Dado que BigInteger é um superconjunto (matemático / funcional) de int, Integer, long e Long, se você precisar usar esses tipos, converta-os em BigInteger, faça o GCD e converta o resultado de volta.
fonte
BigInteger.valueOf(a).gcd(BigInteger.valueOf(b)).intValue()
é muito melhor.Pelo que eu sei, não existe nenhum método integrado para primitivos. Mas algo tão simples como isso deve resolver o problema:
Você também pode usar uma linha se gostar desse tipo de coisa:
Deve-se observar que não há absolutamente nenhuma diferença entre os dois, pois eles são compilados para o mesmo código de byte.
fonte
Ou o algoritmo euclidiano para calcular o GCD ...
fonte
Use goiaba
LongMath.gcd()
eIntMath.gcd()
fonte
A menos que eu tenha goiaba, eu defino assim:
fonte
Jakarta Commons Math tem exatamente isso.
ArithmeticUtils.gcd (int p, int q)
fonte
Você pode usar esta implementação do algoritmo Binary GCD
}
De http://introcs.cs.princeton.edu/java/23recursion/BinaryGCD.java.html
fonte
Algumas implementações aqui não funcionam corretamente se ambos os números forem negativos. gcd (-12, -18) é 6, não -6.
Portanto, um valor absoluto deve ser retornado, algo como
fonte
a
eb
foremInteger.MIN_VALUE
, você receberáInteger.MIN_VALUE
o resultado, que é negativo. Isso pode ser aceitável. O problema é que gcd (-2 ^ 31, -2 ^ 31) = 2 ^ 31, mas 2 ^ 31 não pode ser expresso como um número inteiro.if(a==0 || b==0) return Math.abs(a+b);
para que o comportamento seja realmente simétrico para zero argumentos.podemos usar a função recursiva para encontrar gcd
fonte
Se você estiver usando Java 1.5 ou posterior, este é um algoritmo GCD binário iterativo que usa
Integer.numberOfTrailingZeros()
para reduzir o número de verificações e iterações necessárias.Teste de unidade:
fonte
Este método usa o algoritmo de Euclides para obter o "maior divisor comum" de dois inteiros. Ele recebe dois inteiros e retorna o mdc deles. tão fácil!
fonte
Apache!- tem gcd e lcm, tão legal!
No entanto, devido à profundidade de sua implementação, é mais lento em comparação com a versão simples escrita à mão (se for importante).
fonte
fonte
Usei esse método que criei quando tinha 14 anos.
fonte
Essas funções GCD fornecidas por Commons-Math e Guava têm algumas diferenças.
ArithematicException.class
apenas paraInteger.MIN_VALUE
ouLong.MIN_VALUE
.IllegalArgumentException.class
para quaisquer valores negativos.fonte
O% vai nos dar o mdc. Entre dois números, isso significa: -% ou mod de big_number / small_number são = gcd, e escrevemos em java assim
big_number % small_number
.EX1: para dois inteiros
EX2: para três inteiros
fonte
gcd(42, 30)
deveria estar,6
mas é12
pelo seu exemplo. Mas 12 não é um divisor de 30 e nem de 42. Você deve chamargcd
recursivamente. Veja a resposta de Matt ou procure na Wikipedia o algoritmo euclidiano.