Ir para conteúdo

POWERED BY:

Arquivado

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

~TiuTalk~

[Resolvido] Calculando Somatória

Recommended Posts

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

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

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

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

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

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

×

Informação importante

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