Olá!
Tenho que fazer um algoritmo que identifique quais os números que são potências de 2.
Consegui implementar, só que só são identificadas as potências a partir de 4. Porém, 1 e 2 também são potências.
Alguém pode me dar uma dica sobre o que fazer para os números 1 e 2 serem identificados?
Obrigada!
package filter;
/**classe que filtra as potências de 2
*
* @author Kamilla
*
*/
public class FiltraPot2 extends Filtra{
//**método para filtrar as potências de 2*/
boolean aceita(int x) {
int cont=x;
int filt=0;
for(cont =x ; cont >=2; cont--){
x = x/2;
filt = x;
cont=x;
}
if((filt!=2) || (filt>2))
return false;
else
return true;
}
public static void main(String[] args) {
Filtra f = new FiltraPot2();
f.FiltraInt(2);
f.FiltraInt(3);
f.FiltraInt(7);
f.FiltraInt(4);
f.FiltraInt(1);
f.FiltraInt(8);
f.FiltraInt(16);
f.FiltraInt(32);
f.FiltraInt(64);
f.FiltraInt(128);
}
}
Oi Camila
Num sei se vai funcionar, mas eu faria assim
//faria a verificação no inicio
if((filt==1)||(filt==2))
return true;
//aqui não é necessário verificar se é igual a dois pois o caso foi verificado acima
// for(cont =x ; cont >=2; cont--){
for(cont =x ; cont >2; cont--){
x = x/2;
filt = x;
cont=x;
}
//aqui não é necessário verificar se é diferente de dois pois o caso foi verificado acima
// if((filt!=2) || (filt>2))
if(filt>2)
return false;
else
return true;
}
Porém, se você quiser manter do jeito que fez pode fazer o seguinte, talvez o retorno do else if esteja invertido
Obrigada, Alan! Deu certo!
Só que… eu estava perdendo a precisao dos números, daí alguns que tinha 2.895 era passados como true. Resolvi colocando float em todos, acontece que alguns números ainda continuam com o mesmo problema e eu não consigo idenficar o motivo…
Alguém pode me ajudar?
Obrigada!
Talvez você queira/precisa resolver do seu jeito, provavelmente isso é um exercisio de lógica, e se for o caso, favor ignorar minha sugestão:
No mundo binário, as potências de 2 têm uma caracteristica que é que eles tem exatamente um bit setado, o resto são zeros.
dec 1 = bin 1
dec 2 = bin 10
dec 4 = bin 100
dec 8 = bin 1000
…
e assim pra frente. A classe Integer tem um método que diz quantos bits setados tem num número. Portanto seu método poderia ser definido assim (ele funciona para valores positivos. Só dá resultado errado para -2147483648) :
Ótimo! Deu certinho… Obrigada!
Mas… eu ainda queria saber o motivo de eu estar perdendo a precisão naquela outra implementação… Achei bastante estranho pois a precisão só é perdida para determinados números… =S