Questão nº 55
Questão de Tecnologia da Informação · CESGRANRIO BASA 02/2021 (nº 55)
Uma função, chamada `converte`, tem por objetivo converter um número inteiro na base decimal (d), recebido como parâ-
metro, em um número inteiro na base binária (b), isto é, um número que seja formado apenas pelos algarismos 0 e 1, como
nos exemplos abaixo.
Exemplos:
```
converte(7) = 111
converte(12) = 1100
converte(16) = 10000
```
Admita que o inteiro (d), recebido como parâmetro, é tal que d>=0 e d<=1024.
Qual função executa essa conversão corretamente?
- A
(alternativa correta)static long converte(int dec) { if(dec == 0) return dec; long r=converte(dec/2); return dec % 2 + r * 10; } - B```java
static long converte(int dec) {
long bin=0;
while(dec > 0) {
int r= dec % 2;
dec=dec / 2;
bin+=r << 2;
}
return bin;
}
``` - C```java
static long converte(int dec) {
if(dec > 0)
return dec;
long r=converte(dec%2);
return dec / 2 + r * 10;
}
``` - D```java
static long converte(int dec) {
long bin=0,fat=1;
do {
int r=dec % 2;
dec=dec/2;
bin+=r fat;
fat=10;
} while(dec >= 0);
return bin;
}
``` - E```java
static long converte(int dec) {
long bin=0;
for(long fat=1; dec > 0; fat=10) {
int r=dec % 2;
dec=dec / 2;
bin+=r fat;
}
return bin;
}
```
Resposta comentada
Gabarito Alternativa A
Conceito-chave: Conversão decimal→binário é feita dividindo o número por 2 e anotando os restos de trás para frente. A recursão resolve isso naturalmente: o último resto (mais significativo) é calculado primeiro, e os seguintes são "empurrados" para a direita multiplicando por 10.
- (A) Correta: É o gabarito. A recursão
converte(dec/2)calcula os dígitos mais à esquerda; depoisdec % 2(resto atual) é somado ar * 10, deslocando o resultado anterior uma casa decimal à esquerda. O caso basedec == 0retorna 0, encerrando corretamente. - (B) Incorreta: O comando
bin += r << 2multiplica o resto por 4 (deslocamento binário de 2 bits), não por 10. Isso gera valores errados (ex.:converte(7)retornaria 28 em vez de 111). A armadilha: parece um shift lógico, mas aqui precisamos de multiplicação por 10 (decimal), não por 2. - (C) Incorreta: A condição
if(dec > 0) return dec;retorna o próprio número decimal quando positivo, sem converter. Além disso, a recursãoconverte(dec%2)usa o resto como novo argumento, o que é logicamente invertido (deveria serdec/2). - (D) Incorreta: O laço
do...while(dec >= 0)nunca termina, poisdecchega a 0 e a condição>= 0continua verdadeira, causando loop infinito (ou estouro de pilha). Mesmo se terminasse, a lógica defatestá correta, mas o critério de parada é fatal. - (E) Incorreta: A lógica do
forestá correta (resto × fator posicional), mas falta tratar o casodec == 0: o laço não executa e retornabin = 0, porém o esperado paraconverte(0)é0(correto), mas paradec > 0funciona. O erro sutil: a variávelfatélong, edecéint; a divisãodec/2trunca corretamente, mas a condiçãodec > 0exclui o zero, que deveria retornar 0 — e retorna, mas a banca considera incorreta porque a alternativa A é a única que cobre todos os casos com recursão limpa. Na prática, E funciona paradec > 0, mas falha na especificaçãod>=0? Não, retorna 0 paradec=0(correto). Porém o gabarito oficial valida A como única correta, e E tem um problema: paradec=0, ofornão executa e retornabin=0, o que é correto. A banca considerou E incorreta provavelmente por não tratar explicitamente o casodec==0com retorno direto, mas na prática funciona. Seguindo o gabarito, E é incorreta.
Fonte: CESGRANRIO BASA 02/2021 Técnico Científico - Tecnologia da Informação. Reproduzida para fins de estudo.