maior e menor de 4 numeros - C/C#/C++ - Clube do Hardware
maior e menor de 4 numeros
Por henriquerick, 11 de agosto de 2013 em C/C#/C++
henriquerick 0
Estou cursando Ciência da computação e já no segundo dia de aula o professor lançou um desafio: imprimir o maior e menor entre 4 números, mas não pode utilizar nenhum comando de seleção (IF, SWITCH, condição ternária) ou repetição (FOR, WHILE, DO..WHILE). Alguém tem uma ideia de como pode ser feito isso?
Dica rápida.. esta operação (x > y) sempre retorna 1 ou 0. A partir daí, você tem como bolar alguma coisa...
n = (10 > 4);
n tem o valor 1;
Tendo dois números x e y, o maior é o resultado deste conjunto de operações :
x ^ ((x ^ y) & -(x < y))
Se fossem quatro números, o código aplicado para o primeiro e o segundo número forneceria o maior deles. Este com o terceiro número resultaria no maior dos três primeiros. Este com o quarto número forneceria o maior dos quatro.
henriquerick
Muito obrigado rjj!! Deu certo aqui
Rjj, você poderia explicar em detalhes essa fórmula? Eu não consegui entender essa conta
uma solução mais simples.
Você faz um for para percorrer o vetor, começando com uma variavel 'maior -> int = 0'
e dentro do for, verificar se um numero é maior que a propria variavel maior
maior  = vetor[i]
Pro menor você faz ao contrário.
Agora, caso esteja armazenando em 4 variáveis, vem a chamada gambiarra.
porém a variável maior continua...
e você faz o teste com as 4 variáveis.
você declara a variável maior começando com zero
e depois faz os testes
if (n1 > maior)
e assim por diante até chegar o n4, ou seja, vai repetir o mesmo teste porém com as outras variáveis
pro menor... mesma coisa...
porém a variavel menor tera que começar com um valor digamos "absurdamente" alto
menor = 999999;
ou caso você queira deixar algo "melhor", após os testes com o número maior, a sua variável menor pode receber o número maior
menor = maior
ou a outra opção que é atribuir um valor alto para a variável menor
if (n1 < menor)
dai você ira ter que fazer esses ifs com todas as variáveis que você aloca os números (caso não esteja utilizando vetor)
Não pode usar nenhum laço de repetição e comandos de seleção
Siga essa parte então.
Ou eu entendi que não pode usar nem IFS? é isso? se não segue essa citação que eu te expliquei antes
Se naquela fórmula x for maior que y, tem-se:
x ^ ((x ^ y) & 0)
A operação bit a bit AND entre (x ^ y) e 0 equivale à multiplicação individual entre cada um de seus bits, conforme é aprendido em Álgebra de Boole. Como 0 ou 1 multiplicado por 0 é 0, o resultado seria um número composto apenas de bits 0, o número nulo :
x ^ 0
Pela tabela-verdade da operação XOR, o XOR de um valor lógico e 0 sempre é o próprio valor. Logo, chega-se a:
Que é o mesmo maior número.
Se y for maior que x, tem-se inicialmente:
x ^ ((x ^ y) & -1)
As máquinas atualmente utilizam uma técnica denominada complemento de dois para representar números negativos. Ela funciona de tal forma que uma variável que armazena o número -1 contém apenas bits 1 .