LEFT: Sistemas de Aquisi¸c˜ao de Dados Implementa¸c˜ao de um Algoritmo de Divis˜oes Sucessivas Andr´e Bastos da Cunha 20 de Abril de 2007
1
Introdu¸c˜ ao
Pretende-se simular, numa linguagem arbitr´aria de programa¸c˜ao, um programa que adivinhe um n´ umero escolhido pelo utilizador, atrav´es de tentativas sucessivas, tendo acesso ao intervalo em que este se encontra, introduzido em bits. Em cada uma das tentativas o utilizador dever´a 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 divis˜oes sucessivas. Basicamente consiste no seguinte: • Depois de se definir um n´ umero de bits que exprime o tamanho do intervalo em potˆencia 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 ser´a entre 0 e N − 1 (por causa do 0). • Em cada itera¸c˜ao, o algoritmo aposta sempre no centro do intervalo onde se possam encontrar os poss´ıveis valores do n´ umero a adivinhar. Desta forma, as apostas Ak ser˜ao assim sempre da forma Ak = 2(n−k) + R − 1
(2)
onde R ´e uma constante de offset que varia de acordo com as pistas do utilizador em cada itera¸c˜ao e k cada uma das itera¸c˜oes. Desta forma, todas as opera¸c˜oes de decis˜ao s˜ao reduzidas a divis˜oes por 2 o que facilita a implementa¸c˜ao bin´aria deste algoritmo uma vez que a divis˜ao bin´aria ´e apenas um Shift Right e por isso em cada itera¸c˜ao s´o h´a que ter em conta o bit mais significativo para gerir o programa. Naturalmente, as potencialidades digitais deste algoritmo s˜ao significativas. Ainda assim, n˜ao tendo sido impostas condi¸c˜oes na implementa¸c˜ao do algoritmo, adoptouse uma solu¸c˜ao alg´ebrica directa por quest˜oes de maior simplicidade na linguagem de programa¸c˜ao escolhida, o Java. 1