判断正整数是否为2的某次幂,且是否为4的某次幂

题目:判断正整数是否为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();
	}
}

你可能感兴趣的:(训练)