题目:判断正整数是否为2的某次幂,且是否为4的某次幂
解题思路:先判断1,为2的0次幂
当不是1时,将该数不断除以2,当出现奇数时就退出,并给出否定(除了1以外),若一直到出现1都全是偶数的话,那么就是2的某次幂。具体几次幂可以在循环中加入变量累计。而2的偶数次幂就必定为4的某次幂,即当一个数为2的2k次幂时,也是4的k次幂,由此可同时判断是否为4的某次幂。
具体代码如下:
import java.util.*;
class Test{
public static void main(String[] args){
//判断正整数是不是2的某次幂
//判断一个整数是不是4的某次幂
int i = 0; //输入的数
int k = 0; //记录次幂
Scanner s = new Scanner(System.in);
System.out.println("please input a number:(-1结束)");
i = s.nextInt();
while(i != -1){
if(i == 1){ //处理输入1的情况
System.out.println("YES! 是2的0次幂,且是4的0次幂");
}else if ( i > 1 ){ //大于1
while(i !=1 && i%2 == 0){ //让数不断除以2,若最终结果是1则是2的某次幂
i = i / 2;
k++;
}
if(i == 1){ //一直都能被2整除
System.out.println("YES! 是2的" + k + "次幂");
if(k%2==0){
System.out.println("且是4的" + k/2 +"次幂");
}else{
System.out.println("但不是4的某次幂");
}
}
else //其中有一项不能被2整除
System.out.println("no!");
}else{ //输入的数是0或负数
System.out.println("please input a rigth number!");
}
k = 0;
i = s.nextInt();
}
s.close();
}
}
但是利用位运算符能够更快的解决此类问题:
2的某次幂时,其二进制数是只有一个1,其余全为零,那么利用i & i-1==0即可快速判断是否只有一个1
4的某次幂的前提得是2的某次幂,当为2的某次幂时,若二进制数中1的位置在奇数位上时就是4的某次幂,那么可以利用十六进制数0x55555555(01010101010101010101010101010101)来跟该数进行与运算,即可判断出1所在的位置的奇偶性
import java.util.*;
class Test{
public static void main(String[] args){
int i = 0;
Scanner s = new Scanner(System.in);
System.out.println("please input a number:(-1结束)");
i = s.nextInt();
while(i != -1){
if(i == 1){ //处理输入1的情况
System.out.println("YES!是正整数的0次幂");
}else if ( i > 1 ){ //大于1
int flag = i & i-1; //若i的二进制数只有1个1,就是2的某次幂
if(flag == 0){
System.out.println("YES!是2的某次幂");
//再判断是否为4的某次幂
flag = i&0x55555555; //01010101010101010101010101010101 判断是否为奇数位上
if(flag!=0){
System.out.println("也是4的某次幂");
}else{
System.out.println("但不是4的某次幂");
}
}
else{
System.out.println("NO!");
}
}else{ //输入的数是0或负数
System.out.println("please input a rigth number!");
}
i = s.nextInt();
}
s.close();
}
}