Este é um artigo bem básico. O objetivo dele é apresentar um algoritmo que permite calcular eficientemente o mínimo múltiplo comum (MMC) entre dois números naturais.

Como sempre, também apresento a implementação desse algoritmo em Java e em C.
Revisão Rápida de MMC
O MMC entre dois números naturais (vou me limitar ao conjunto dos números naturais) é o menor número natural que é múltiplo de ambos os números. Exemplos:
- o MMC de 24 e 12 é igual a 24;
- o MMC de 36 e 14 é igual a 252;
- o MMC de 11 e 9 é igual a 99.
Uma das maneiras de calcular o MMC envolve a fatoração dos números em fatores primos, conforme o exemplo da imagem a seguir, que emprega um dispositivo prático, geralmente ensinado no ensino fundamental, para computar o MMC de 60 e 100 (cujo resultado é 300). Não irei detalhar como funciona o dispositivo, pois não é o objetivo da postagem.

Outro método seria fatorando os números em potências inteiras de números primos e multiplicando apenas as maiores potências de cada primo:
- 60=22×3×5
- 100=22×52
A maior potência de 2 é 22. A maior potência de 3 é 3. A maior potência de 5 é 52, logo
MMC(60,100)=22×3×52=300
O problema dos métodos anteriores é que a fatoração de números inteiros é um problema NP, não existindo um algoritmo que possa fazer isso de maneira eficiente.
A Relação entre o MMC e o MDC
O MMC e o MDC (máximo divisor comum) possuem uma propriedade muito interessante [1]:
MMC(a,b)×MDC(a,b)=a×b
Isto é, o produto de dois números é igual ao produto do MMC pelo MDC desses números.
Isolando o MMC na equação, temos
MMC(a,b)=a×bMDC(a,b)
Ou seja, podemos calcular o MMC utilizando o MDC. A vantagem disso é que o MDC pode ser calculado eficientemente através do algoritmo de Euclides, que foi apresentado numa postagem anterior do blog.
Portanto, basta implementar o algoritmo de Euclides e a fórmula anterior para calcular o MMC eficientemente e sem a necessidade de realizar a fatoração dos números.
Para evitar problemas de "estouro de variável" (overflow), é recomendado realizar a divisão antes da multiplicação:
MMC(a,b)=a×bMDC(a,b)=b×aMDC(a,b)
Códigos
Os códigos a seguir implementam a fórmula apresentada anteriormente para calcular o MMC. Os mesmos já possuem o algoritmo de Euclides (versão iterativa) implementado.
MMC em Java
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 | //Código por Henrique Felipe (GitHub: HenriqueIni) public class MMC { //Algoritmo de Euclides iterativo private static int mdc( int a, int b){ while (b != 0 ){ int r = a % b; a = b; b = r; } return a; } //Algoritmo do MMC private static int mmc( int a, int b){ return a * (b / mdc(a, b)); } //Testes public static void main(String[] args) { System.out.println( "MMC" ); System.out.printf( "mmc(30, 60) = %d\n" , mmc( 30 , 60 )); System.out.printf( "mmc(60, 100) = %d\n" , mmc( 60 , 100 )); System.out.printf( "mmc(36, 14) = %d\n" , mmc( 36 , 14 )); } } |
MMC em C
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 | //Código por Henrique Felipe (GitHub: HenriqueIni) #include <stdio.h> #include <stdlib.h> //Algoritmo de Euclides iterativo int mdc( int a, int b){ while (b != 0){ int r = a % b; a = b; b = r; } return a; } //Algoritmo do MMC int mmc( int a, int b){ return a * (b / mdc(a, b)); } //Testes int main() { printf ( "MMC\n" ); printf ( "mmc(30, 60) = %d\n" , mmc(30, 60)); printf ( "mmc(60, 100) = %d\n" , mmc(60, 100)); printf ( "mmc(36, 14) = %d\n" , mmc(36, 14)); return 0; } |
Referências
[1] SODRÉ, U., BENITO, R. (2006) ENSINO FUNDAMENTAL: Números naturais (II)
Boa noite, como faço para usar mais de 2 números? Grato desde já =D
ResponderExcluirSim, você calcula o MMC dos dois primeiros, pega o resultado e calcula o MMC do resultado com o próximo número e assim sucessivamente.
ExcluirExemplo: MMC(8, 12, 16, 32)
Primeiro, você calcula o MMC de 8 e 12
MMC(8, 12) = 24
Agora, calculamos o MMC de 24 e 16
MMC(24, 16) = 48
Por fim, calculamos o MMC de 48 e 32
MMC(48, 32) = 96
Portanto, MMC(8, 12, 16, 32) = 96.
Quase esqueci, mas tem um post no blog onde eu mostro como fazer o MMC de uma lista de números em Java, C e em JavaScript: MMC de uma lista de números
Excluirmassa
ResponderExcluirQual seria a complexidade desse algoritmo em notação O?
ResponderExcluirseria um O(n)?
Ele tem a mesma complexidade do algoritmo de Euclides no pior caso. Se você está calculando o MMC(a,b), a complexidade no pior caso será O(log(min(a,b))). Onde min(a,b) é o menor valor entre a e b. Se o menor é o a, então será O(log a), se o menor for o b, então vai ser O(log b).
ExcluirCerto! Não compreendi nada.
ResponderExcluirnão é a minha área. ;) :( :( ;( ;)
Não pense assim, nem tudo é fácil, basta se esforçar
ExcluirOlá, por que o mmc foi feito como "return a * (b / mdc(a, b));" ?
ResponderExcluirPorque a forma mais eficiente de calcular o MMC é utilizando o MDC
Excluir