Sie sind auf Seite 1von 3

LEFT: Sistemas de Aquisicao de Dados

Implementacao de um Algoritmo de Divisoes Sucessivas


Andre Bastos da Cunha
20 de Abril de 2007

Introduc
ao

Pretende-se simular, numa linguagem arbitraria de programacao, um programa que adivinhe


um n
umero escolhido pelo utilizador, atraves de tentativas sucessivas, tendo acesso ao intervalo em que este se encontra, introduzido em bits. Em cada uma das tentativas o utilizador
devera dizer ao programa se o n
umero a adivinhar e maior, menor ou igual `a u
ltima aposta.
O algoritmo que se pretende implementar e o chamado algoritmo de divisoes sucessivas.
Basicamente consiste no seguinte:
Depois de se definir um n
umero de bits que exprime o tamanho do intervalo em potencia
de base 2,
N = 2n

(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;
}

pergunta ao utilizador se e maior e em caso positivo, soma o intervalo absoluto ao offset.

else {
System.out.println("E maior? (true/false)");
boolean maior = Consola.readBool();
if (maior) {
cumulativo = cumulativo + intervalo;
}

Caso contrario, mantem o valor anterior de offset.

else {
cumulativo = cumulativo;
}
}

Nesta u
ltima condicao booleana, termina o ciclo que compoe o algoritmo central do
programa.

Das könnte Ihnen auch gefallen