~TiuTalk~ 7 Denunciar post Postado Setembro 4, 2008 Gente, sabem aquelas questões de somatória que tem em vestibular? Opções: 1 - Azul 2 - Verde 4 - Rosa 8 - Preto 16 - Branco Aí se o resultado é '19' por exemplo, seria 16 + 2 + 1 (as três verdadeiras)... Como fazer isso no PHP? Penso em algo assim: $opcoes = array(); $opcoes[1] = 'Azul'; $opcoes[2] = 'Verde'; $opcoes[4] = 'Rosa'; $opcoes[8] = 'Preto'; $resultado = 7; Só não sei bolar um jeito eficiente de descobrir quais opções fazem parte do resultado (no caso 4, 2 e 1)... por que o n° de opções pode variar no projeto que estou criando... Alguém tem uma sugestão? ^^ Compartilhar este post Link para o post Compartilhar em outros sites
Mauro M. Pagnez 0 Denunciar post Postado Setembro 4, 2008 Utilize as técnicas de matemática binária e decomposição de números. Ex.: 4 + 2 + 1 = 7. O número 7 em binário = 111. Decompondo, temos: 1 x 2² + 1 x 2¹ + 1 = 1 x 4 + 1 x 2 + 1 = 4 + 2 + 1 = 7. É só você usar números binários, porque pelo que vi, você está somando números múltiplos de 2, o que até facilita os cálculos. Viu como é fácil? Já mexeu com porta paralela? No seu caso está sendo a mesma lógica. É só lembrar os "leds". Compartilhar este post Link para o post Compartilhar em outros sites
~TiuTalk~ 7 Denunciar post Postado Setembro 4, 2008 Utilize as técnicas de matemática binária e decomposição de números. Ex.: 4 + 2 + 1 = 7. O número 7 em binário = 111. Decompondo, temos: 1 x 2² + 1 x 2¹ + 1 = 1 x 4 + 1 x 2 + 1 = 4 + 2 + 1 = 7. É só você usar números binários, porque pelo que vi, você está somando números múltiplos de 2, o que até facilita os cálculos. Viu como é fácil? Já mexeu com porta paralela? No seu caso está sendo a mesma lógica. É só lembrar os "leds". Fico feliz que você tenha uma idéia de como pode ser feito, mas ainda não consegui captar a essência da coisa... sou muito inexperiente com binários =P, no caso 1x2² seria o maior número da soma e depois é só ir diminuindo, em 1, o 'elevado'? Mas no caso, e se for 16 e 2? seria (1x2^4) + (1x2^1), o que não daria pra fazer num loop o que falei ali em cima (diminuindo, em 1, o 'elevado') Perdoe-me se eu estiver errado.. xD Edit: Acho que estou entendendo.. Binário de 12 é '1100', o que seria (1 x 2^3) + (1 x 2^2) + (1 x 2^0) + (1 x 2^0), que é 8 + 4 + 0 + 0, confere? Compartilhar este post Link para o post Compartilhar em outros sites
Mauro M. Pagnez 0 Denunciar post Postado Setembro 4, 2008 Nesse caso é o seguinte. A soma é 16 + 2, certo? O resultado é 18. Transforme o resultado em binário. Vai dar 10010. Lembrando das strings, você vai contar a quantidade de caracteres de 10010, que são 5. Você vai fazer o seguinte: 1 x 2^(5-1) + 0 x 2^(5-2) + 1 x 2^(5-3) + 1 x 2^(5-4) + 0 x 2^(5-5). Perceba que o expoente é o count() do resultado decrementado. Para obter valor por valor do 18 binário, vamos supor que ele estivesse dentro de uma variável a, e o expoente, na variável b, você faria, no primeiro loop: a x 2^(b - x); e depois x--. Entendeu? Edit: Foi mal, eu não tinha visto que tu tinha editado rsrs Compartilhar este post Link para o post Compartilhar em outros sites
~TiuTalk~ 7 Denunciar post Postado Setembro 4, 2008 Poxa mauro.. ajudou muito... enquanto você postava li o artigo na wikipedia sobre binarios que explica isso também... os dois juntos me fizeram entender... muito obrigado mesmo! =) Compartilhar este post Link para o post Compartilhar em outros sites
Mauro M. Pagnez 0 Denunciar post Postado Setembro 4, 2008 Tranqïlo. Quando precisar se eu souber e der tempo de responder, pode contar. Falow! Compartilhar este post Link para o post Compartilhar em outros sites
~TiuTalk~ 7 Denunciar post Postado Setembro 4, 2008 Consegui aqui... o código pra quem quiser: <?php $opcoes = array(); $opcoes[1] = 'Azul'; $opcoes[2] = 'Branco'; $opcoes[4] = 'Verde'; $opcoes[8] = 'Rosa'; $opcoes[16] = 'Preto'; $resultado = 21; $binario = decbin($resultado); echo "Se a resposta é {$resultado}, as opções são: "; echo '<br>'; $respostas = array(); $i = 0; for ($x = $b = strlen($binario); $x > 0; $x--) { $valor = $binario[$i] * pow(2,($x - 1)); $i++; if ($valor > 0) $respostas[] = $opcoes[$valor].' ('.$valor.')'; } $respostas = array_reverse($respostas); echo '<pre>'; print_r($respostas); echo '</pre>'; ?> Resultado: Se a resposta é 21, as opções são: Array ( [0] => Azul (1) [1] => Verde (4) [2] => Preto (16) ) Muito obrigado mesmo! =) Compartilhar este post Link para o post Compartilhar em outros sites