分值:50
程序执行时限: 1000 ms
描述
请使用递归的方式判断一个给定的整数是否为2的整数次幂。
提示:当一个数 n = 2^k (k为非负整数)时,我们说n是2的整数(k)次幂。比如 2、4、8、16都是2的整数次幂,但3、7、14就不是。
输入
一行,一个正整数n
输入约束:
1<=n<=2^31
输出
一行,数字1或0。
如果输入为2的整数次幂,则输出1,否则输出0。.
理论上只要一直用2除,只要最后的结果是1,那么就可以确定可以整除,所以有如下代码:
import java.io.*;
/**
* @ClassName U1106p1
* @Description TODO
* @Author liyc5
* @Date 2019/10/27 15:02
* @Version 1.0
**/
public class U1106p2 {
public static void main(String[] args) throws Exception {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
try{
String trim = br.readLine().trim();
Integer integer = Integer.valueOf(trim);
if (integer == 1) {
System.out.println(1);
} else {
System.out.println(test(integer));
}
} catch (Exception e) {
e.printStackTrace();
}
}
public static int test(Integer a){
if (a == 0 || a == 2) {
return 1;
} else if (a == 1) {
return 0;
}
float b = ((float)a / 2);
if (!String.valueOf((int)(b * 10)).endsWith("0")){
return 0;
}
return test((int) b);
}
}
但是这样写的缺点也很明显啦,就是需要不停的循环,虽然这个循环次数不是很多,但仍不是最优解,
其实有一种更加简单的方法,因为计算机存储任何数据最终都是以二进制的方式存储的,所以我们可以利用计算机这个固有的 性质来解决这个问题。
通过观察发现可以被2整除的数都是高位为1,其他位全为0,如:
2 10
4 100
8 1000
16 10000
所以我们只要判断一下这个数是否满足这样的性质即可。.
这里我们用到了位与运算。
int n = 16;
System.out.println((n & (n-1)) == 0);