Introduc
ao
(1)
onde N e o n
umero total de n
umeros e n o n
umero de bits escolhido, tem-se de imediato
que o intervalo a estudar sera entre 0 e N 1 (por causa do 0).
Em cada iteracao, o algoritmo aposta sempre no centro do intervalo onde se possam
encontrar os possveis valores do n
umero a adivinhar. Desta forma, as apostas Ak serao
assim sempre da forma
Ak = 2(nk) + R 1
(2)
onde R e uma constante de offset que varia de acordo com as pistas do utilizador em
cada iteracao e k cada uma das iteracoes.
Desta forma, todas as operacoes de decisao sao reduzidas a divisoes por 2 o que facilita
a implementacao binaria deste algoritmo uma vez que a divisao binaria e apenas um Shift
Right e por isso em cada iteracao so ha que ter em conta o bit mais significativo para gerir
o programa. Naturalmente, as potencialidades digitais deste algoritmo sao significativas.
Ainda assim, nao tendo sido impostas condicoes na implementacao do algoritmo, adoptouse uma solucao algebrica directa por questoes de maior simplicidade na linguagem de programacao escolhida, o Java.
1
Implementac
ao
Vai-se aqui proceder a uma descricao detalhada do algoritmo central do programa, relegando
no entanto para segundo plano, questoes mais tecnicas de programacao (estando no entanto
comentadas no codigo fonte do programa).
Uma vez que o algoritmo e iterativo, e imediato que devera correr num ciclo. Para este
efeito adoptou-se um ciclo for que corre n vezes no maximo.
A variavel nbits controla o ciclo, como tal deve ser decrementada em cada iteracao.
A variavel intervalo representa o intervalo absoluto (sem offset) onde se vai fazer a
aposta. Em cada iteracao este valor vai sendo cada vez mais pequeno ate convergir para
apenas um valor.
A variavel aposta e o valor final depois de cada iteracao proposto pelo programa. Combina o intervalo absoluto, soma-lhe a variavel cumulativo que nao e mais que o valor do
offset em cada iteracao.
nbits = nbits -1;
double intervalo = Math.pow(2, nbits);
double aposta = intervalo + cumulativo - 1;
Temos agora um mecanismo de seguranca que termina o programa caso a variavel nbits
atinja um valor nulo. Como isso so se devera verificar quando o valor da aposta e garantidamente certo, o programa emite o resultado e termina.
if (nbits == 0) {
System.out.println("O numero e");
System.out.println(aposta);
break;
}
O programa poe a sua aposta e aguarda pela resposta do utilizador. Caso acerte, emite
o resultado e termina, caso contrario,
System.out.println(aposta);
System.out.println("E o numero? (true/false)");
boolean sucesso = Consola.readBool();
if (sucesso) {
System.out.println("O numero e");
System.out.println(aposta);
break;
}
else {
System.out.println("E maior? (true/false)");
boolean maior = Consola.readBool();
if (maior) {
cumulativo = cumulativo + intervalo;
}
else {
cumulativo = cumulativo;
}
}
Nesta u
ltima condicao booleana, termina o ciclo que compoe o algoritmo central do
programa.