Ir para conteúdo

POWERED BY:

Arquivado

Este tópico foi arquivado e está fechado para novas respostas.

Archie

m.m.c.

Recommended Posts

Pra você descobrir se um número é múltiplo de outro, é só fazer uma divisão modular... se der 0, é múltiplo.

 

Por exemplo: 25 % 5 == 0

 

Se tiver que criar essa função, você vai testando todos os múltiplos possíveis... aí, quando a divisão por ambos der zero, você achou um múltiplo comum.

 

[]'s!

Compartilhar este post


Link para o post
Compartilhar em outros sites

Não testei, mas acho q a é mais ou menos por aí.

Considerando que $num1 e $num2 são números inteiros:

 

<?

 

function mmc ($num1, $num2)

{

$maior = max($num1, $num2);

$menor = min($num1, $num2);

for ($i=2; $i<$menor; $i++)

{

if (($maior%$i == 0) && ($menor%$i == 0))

{

$mmc = $i; break; // retirando o break, você obteria o mdc

}

}

return $mmc;

}

 

$num1 = 9;

$num2 = 27;

 

echo mmc($num1, $num2);

 

?>

Compartilhar este post


Link para o post
Compartilhar em outros sites

Acho que é isso aí, mesmo... só fazendo uma observação: defina um valor padrão pra variável $mmc antes de entrar no laço... pois caso não encontre um MMC entre os dois, você vai retornar uma variável que não está definida. ;)

Compartilhar este post


Link para o post
Compartilhar em outros sites

Valeu gente! http://forum.imasters.com.br/public/style_emoticons/default/joia.gif

Eu já tinha pensado nisso, eu queria mesmo saber se existe uma função pré-definida. É que gente, eu to trabalhando com cálculos de CENTENAS de frações, e até agora tenho feito o denominador ficar igual obtendo um múltiplo comum da forma mais simples (o produto de todos os denominadores). Estou falando de números grandões mesmo, do tipo que o PHP nem mostra mais totalmente, usando aqueles E's. E o problema é que chega um ponto onde ele nem mesmo consegue mais representar o número, e põe um valor estranho de erro. Eu queria fazer o MMC dessa centena de numeros ENORMES, pra ver se dava alguma diferença (as vezes nem vai dar =/) e portanto pra ver se eu conseguia terminar o cálculo sem erro. O método apresentado por vocês é totalmente funcional, mas para números acima de 1 trilhão, e centenas desses números, a coisa fica preta. Por isso eu queria uma função pré-definida. Agora, como parece não ter, seria necessário que eu criasse. Uma forma seria a de vocês. Porém vamos ver se encontramos um forma mais exata. A primeira forma que eu pensei seria usar um algoritmo semelhanto àquele que usamos nas escola, aquele onde fatoramos todos os números juntos até que todos tornem-se 1.

Problema: Seria necessária uma lista enorme de números primos, que é coisa difícil de se consguir, e demorada. Portanto, nem pensar!

A outra forma que eu pensei foi o raciocínio. Num M.M.C, temos algumas opções de resultado:

 

1 - um número (x) é múltiplo do outro (y). nesse caso, o mmc é o maior (x).

 

2 - são dois números (x,y) cujo m.d.c é (z, que não é 1). Nesse caso, o mmc deve ser x*y/z ou y*x/z, pois eles são iguais. Para provar isso, supomos que eles sejam diferentes:

x*y/z != y*x/z

xy/z != yx/z

z(xy/z) != z(yx/z)

xy != yx, o que é ilógico.

 

Exemplo:

mmc(8,10).

 

mdc (8,10) = 2 != 0, portanto, podemos usar o método.

mmc(8,10) = 8*10/2 = 10*8/2

mmc(8,10) = 8*5 = 10*4

mmc(8,10) = 40

 

o que é verdade =)

 

3 - Os números (x,y) são primos entre si, ou seja, o mdc deles é 1. Nesse caso o mmc é xy descarado mesmo. Como 'purexemplo':

mmc(7,10).

 

mdc(7,10) = 1, portanto x é primo de y.

mmc(7,10) = 7*10 = 70

 

OK, são esses os únicos três resultados possíveis para um MMC de dois números. Qual é o único problema? MDC. O mdc é chatinho de se tirar, mas ao menos não são necessários primos (podemos usar o algoritmo da grade). Porém, mesmo este algoritmo acaba se apresentando lento depois de certo tempo. Então qual a solução? Eu pensei em não calcular o MDC, mas pelo menos um DC qualquer, que já ajudaria. Para isso, testaríamos os dois números em divisões por 2, 3, 4, 5, 6, 7, 8, 9 e 10. É bastante provável que já achemos um divisor comum por aí. Assim, não obteríamos um MMC, mas ao menos um MC menos discarado, talvez menor.

 

O código para PHP deveria ficar assim: (lembre-se que a função não garante um MMC, mas mesmo assim ela retorna um múltiplo comum que geralmente é menor que o produto dos números. Prova disso é que no fim do código eu chamo a função para dois números e mostro o resultado. Também mostro o produto. Veja que a diferença é notável. Você também pode com extrema facilidade aumentar a exatidão do mmc, bastando modificar o for, aumentado o valor de $i. Como eu disse, é realmente possível criar um sistema de mmc EXATO sem brute force, usando o argoritmo de grade pra mdc. Mas como o objetivo aqui é velocidade...)

 

PHP

[*]function mmc ($n1 , $n2) {

[*]

[*]// Define as duas variáveis:

[*]$nummaior = max ($n1 , $n2);

[*]$nummenor = min ($n1 , $n2);

[*]

[*]// Fazemos o teste do primeiro caso:

[*]if ($nummaior % $nummenor == 0) {

[*]return $nummaior;

[*]}

[*]

[*]/* Agora tentamos achar um divisor comum entre os números de 2 a 10, 

[*]caso não consigamos retornamos o m.m.c. como sendo o produto dos dois

[*] números: */

[*]for ($i = 10 ; $i > 1 ; $i --) {

[*]

[*]if ($nummaior % $i == 0 && $nummenor % $i == 0) {

[*]return $nummaior*$nummenor/$i;

[*]}

[*]

[*]}

[*]

[*]return $nummaior*$nummenor;

[*]

[*]}

[*]

[*]// O pequeno teste para mostrar a utilidade:

[*]echo mmc (45456454242 , 12) . "<br>" . 12*45456454242;

 

Que pena que não há uma função pré-definida =/

Compartilhar este post


Link para o post
Compartilhar em outros sites

Problema: Seria necessária uma lista enorme de números primos, que é coisa difícil de se consguir, e demorada. Portanto, nem pensar!

Bom, mesmo que tu não use-a, achei relevante postá-la aqui. Certa vez criei uma função que gera uma faixa de números primos, de acordo com dois parâmetros: mínimo e máximo. Aqui está ela: http://forum.wmonline.com.br/index.php?showtopic=123069. http://forum.imasters.com.br/public/style_emoticons/default/thumbsup.gif

 

[]s :D

Compartilhar este post


Link para o post
Compartilhar em outros sites

Problema: Seria necessária uma lista enorme de números primos, que é coisa difícil de se consguir, e demorada. Portanto, nem pensar!

Bom, mesmo que tu não use-a, achei relevante postá-la aqui. Certa vez criei uma função que gera uma faixa de números primos, de acordo com dois parâmetros: mínimo e máximo. Aqui está ela: http://forum.wmonline.com.br/index.php?showtopic=123069. http://forum.imasters.com.br/public/style_emoticons/default/thumbsup.gif

 

[]’s :D

<{POST_SNAPBACK}>

ok =) obrigado pela atenção. realmente não a usarei, pois como disse, brute force mataria meu script neste momento. mas é interessante sim a sua lista. eu tava pensando esses dias, aliás, em deixar meu pc ai trabalhando e gerando números primos até casas milionárias, e registrar em mysql. ai eu poderia usar uma função de verificação de primos acessando o banco de dados; mas por enquanto acho que já consegui o que queria. Vamos ao pi!

vlw pra tds que me ajudaram! http://forum.imasters.com.br/public/style_emoticons/default/joia.gif

Compartilhar este post


Link para o post
Compartilhar em outros sites

×

Informação importante

Ao usar o fórum, você concorda com nossos Termos e condições.