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!
packagefilter;/**classe que filtra as potências de 2 * * @author Kamilla * */publicclassFiltraPot2extendsFiltra{//**método para filtrar as potências de 2*/booleanaceita(intx){intcont=x;intfilt=0;for(cont=x;cont>=2;cont--){x=x/2;filt=x;cont=x;}if((filt!=2)||(filt>2))returnfalse;elsereturntrue;}publicstaticvoidmain(String[]args){Filtraf=newFiltraPot2();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 inicioif((filt==1)||(filt==2))returntrue;//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)returnfalse;elsereturntrue;}
Porém, se você quiser manter do jeito que fez pode fazer o seguinte, talvez o retorno do else if esteja invertido
Tenta usar o debug com breakpoint para verificar, ajuda bastante.
Espero ajudar.
Abraços, Alan
KamillaaaH
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 -[telefone removido]) :
Ó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
Sami_Koivu
Olá,
Acho que está o problema está na lógica.
Para mim, isso parece dar o resultado correto:
// **método para filtrar as potências de 2*/booleanaceita(floatx){floatfilt=x;floatcont=0;if((filt==1f)||(filt==2f)){returntrue;}for(cont=x;cont>2.000f;){x=(x/2.000f);cont=x;filt=x;}if((filt<2.000f)){returnfalse;}elsereturntrue;}
Eu tirei o cont-- do for, e invertei a regra do if final. (linha 15 nesse exemplo)
[]s,
Sami
KamillaaaH
Sim, deu certo! =D
Só que o 1 e o 2 continuam de fora… T.T