Archie 0 Denunciar post Postado Setembro 13, 2005 Olá gente! Eu gostaria de saber se existe alguma função pré-definida em PHP que retorne o m.m.c de determinados numeros... caso contrario, eu teria que criá-la = trabalho, porque não parece ser fácil não... alguém sabe? http://forum.imasters.com.br/public/style_emoticons/default/assobiando.gif Compartilhar este post Link para o post Compartilhar em outros sites
red neck * 0 Denunciar post Postado Setembro 13, 2005 talvez você ache algo aqui: http://br.php.net/manual/pt_BR/ref.math.php se nao achar so fazendo mesmo XD boa sorte []'s Compartilhar este post Link para o post Compartilhar em outros sites
Illidan 0 Denunciar post Postado Setembro 13, 2005 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
Marcio Leandro 0 Denunciar post Postado Setembro 13, 2005 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
Illidan 0 Denunciar post Postado Setembro 13, 2005 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
Archie 0 Denunciar post Postado Setembro 14, 2005 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
PauloFreitas 0 Denunciar post Postado Setembro 14, 2005 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
Archie 0 Denunciar post Postado Setembro 14, 2005 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