Ir para conteúdo

POWERED BY:

Arquivado

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

David Ramires

Trocar Valores entre 2 var....

Recommended Posts

Galera.. beleza... Bom tomara q ninguém me critique por colcoar esse desafio.. mas é bem interessantedado os valores:a = 100;b = 20;----------------trocar os valores sem usar uma terceira variável... e claro o resultato é:a = 20;b = 100;t+

Compartilhar este post


Link para o post
Compartilhar em outros sites

ok, a regra étrocar os valores sem usar uma terceira variável...então eu faria assim:$a = 20;$b = 100;pronto, não usei uma terceira variavel o.O

Compartilhar este post


Link para o post
Compartilhar em outros sites

=D

 

$a= 20;$b=100;list($b,$a) = array($a,$b);echo "a = " . $a . " e b = " . $b;

Compartilhar este post


Link para o post
Compartilhar em outros sites

é isso ai óh

 

$a = 20;

$b = 100;

 

echo "<br>a = $a <br>b = $b";

 

$b = $b - $a;

$a = $b + $a;

$b = $a - $b;

 

echo "<br>a = $a <br>b = $b";

 

Passo a Passo

a = 20

b = 100

 

b = 100 - 20 (80)

a = 80 + 20 (100)

b = 100 - 80 (20)

 

a = 100

b = 20

 

http://forum.imasters.com.br/public/style_emoticons/default/thumbsup.gif/>

Compartilhar este post


Link para o post
Compartilhar em outros sites

Acredito que a idéia do desafio deve ser: trocar dois valores sem utilizar uma terceira variável e utilizando um algoritmo eficiente.

Dessa forma, como a imensa maioria dos algoritmos aqui apresentados não são nada eficientes, não devem ser consideradas como solução.

Pior é quando se usam funções para realizar a operação de troca. Chamada de função ocorre em tempo de execução maior e, para piorar, são criadas mais variáveis pela função chamada (assim, não houve economia de variáveis, e sim um aumento delas).

Além do que chamar uma função que resolve um problema nem sempre é resolver o problema. Na verdade quem resolveu o problema foi a função, não vocês.

 

A solução "boa" apresentada aqui foi:

 

  Citar

$b = $b - $a;

$a = $b + $a;

$b = $a - $b;

já que ela só utiliza duas variáveis de fato (não existem funções criando outras variáveis), não há chamadas a funções, o algoritmo só utiliza três operações básicas de atribuição e retorna o valor esperado. Parabéns MadeInNordeste

 

Uma solução melhor é através de operadores bit-a-bit XOR.

Suponha que $a e $b sejam inteiros e que suas representações em binário sejam, respectivamente, 1001 e 0011.

O operador && (OR não bit-a-bit) é bastante conhecido. Ele converte os operandos um booleanos e faz a comparação

  Citar

$c = $a && $b;

neste exemplo, $a é convertido pra true, $b pra true e TRUE AND TRUE = TRUE, logo, $c = TRUE.

Usamos && muito em if.

Um operador bit-a-bit é parecido, só que ele não faz a conversão para booleano. Ele compara os valores bit-a-bit.

Exemplo:

  Citar

$c = $a & $b; // usamos só um & quando desejamos utilizar o operador bit-a-bit

nesse exemplo, $c = 0001, pois realizamos a operação com cada um dos bits de $a e $b
  Citar

1001 &

0011 =

0001

olhando pro 1º algarismo de $a e $b, 1 & 0 = FALSE (0); pro segundo, 0 & 0 = 0; pro terceiro, 0 & 1 = 0; pro último, 1 & 1 = TRUE (1).

O operador XOR (^) é parecido com o OR (|), só que só retorna true se os bits comparados forem, ou o 1º TRUE, ou o segundo TRUE, mas não os dois ao mesmo tempo (por isso é chamado de OU EXCLUSIVO). Assim, 0^0=0, 1^1=0, 0^1=1, 1^0=1.

Demonstra-se matematicamente que o operador comuta ($a^$b=$b^$a), é associativo ($a^$B)/>^$c = $a^($b^$c) e que $a^$a^ = operador identidade, isto é, $a^$a^$b = I($B)/> = $b, isto é, é como se não existisse $a^$a^. Para entender a última propriedade, basta ver que $a ^ $a = 0, para todo $a, e que 0^$b=$b, para todo $b.

Ver este link, do site PHP.net

Além disso, a utilização desse operador é mais rápido que os operadores + e -, o que faz o algoritmo apresentado a seguir ser mais eficiente do que o algoritmo que eu falei inicialmente, mostrado por MadeInNordeste.

$a = $a^$b;
$b = $a^$b;	  // b passa a ser ($a^$B)[novo valor de $a] ^$b = $a^($b^$B)= $a^0 = $a
$a = $a^$b;	  // a passa a ser ($a^$B)[novo valor de $a, associado na 1ª linha] ^ $a[novo valor de $b, após a segunda linha] = $a^($b^$a) = $a^($a^$B) (pela propriedade da comutatividade) = ($a^$a)^$b= 0^$b = $b
Essa solução pode ser até de difícil compreensão, mas está correta e é eficiente.

 

Agora, uma dica pra vcs. Embora seja fácil ver que a solução do MadeInNordeste está correta, sempre é bom demonstrar (e não dá um exemplo), pois tem algoritmos ineficazes que funcionam somente para alguns exemplos. Demonstrando, sabemos q o algoritmo funciona para todos os casos.

Demonstrando o algoritmo do MadeInNordeste:

  Citar

$b = $b - $a;

$a = $b + $a; // $a = ($b-$a)[$b depois da primeira linha] + $a = $b + ($a-$a) = $b

$b = $a - $b; // $b = $b[novo valor de $a, após a segunda linha] - ($b-$a)[$b depois da primeira linha] = $b-$b+$a = $a

Vlw galera pelo interessante problema.

 

-----------

Rarylson Freitas

2º Ano

Instituto Militar de Engenharia

Compartilhar este post


Link para o post
Compartilhar em outros sites

Valew Math Man por ter colocado a solução usando XOR em uma forma mais compacta. Se ficou um pouco complicado o código dele pra alguém, vou colocar outro com praticamente a mesma velocidade de execução que é bem claro.

$a ^= $b;
$b ^= $a;
$a ^= $b;
Vale salientar que
  Citar

$b = $b - $a;

$a = $b + $a;

$b = $a - $b;

apresenta alguns problemas. Imagine, por exemplo, um programa em C que utiliza inteiros de 8 bits.

Sejam também

  Citar

$a = 01111111

$b = 11001111

Usei $ (embora não seja o padrão do C) para manter a sintaxe do PHP.

Lembrar que em C o primeiro algarismo se refere ao sinal, assim,

  Citar

$a = -1111111

$b = +1001111

Ao realizar a primeira operação, executa-se o código da direita para a esquerda e
  Citar

-$a = +1111111

$b - $a = (+1111111) + (+1001111)

Daí, o número resultante é maior que o maior inteiro que pode ser armazenado, o que ocorrerá em um erro.

Um erro deste tipo não acontece usando o algoritmo que usa XOR, já que o valor atribuído para $b continuará a ter 8 algarismos.

Outra observação relevante é que este algoritmo também serve para trocar variáveis de outros tipos (como string, float) sem nenhum problema.

Compartilhar este post


Link para o post
Compartilhar em outros sites

É a coisa mais fácil do mundo fazer isso..xD

<?php

$a = 100;

$b = 20;

$a = $b;

$b = $a;

?>

 

 

  David Ramires disse:

Galera.. beleza...

Bom tomara q ninguém me critique por colcoar esse desafio.. mas é bem interessante

 

dado os valores:

 

a = 100;

b = 20;

 

----------------

trocar os valores sem usar uma terceira variável... e claro o resultato é:

 

 

a = 20;

b = 100;

 

 

t+

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.