以我们常用的2的幂、3的幂、4的幂解法作为例子
1. 2的幂解法
问题: 判断一个数是否是2的幂
解法一: 常规解法
bool isPowerOfTwo(int n) {
if (n <= 0) return false;
int ans = 0;
while (n != 0) {
if (n&1) ans++;
n >>= 1;
}
if (ans > 1) return false;
return true;
}
优化:
bool isPowerOfTwo(int n) {
if (n <= 0) return false;
while (n&1 == 0) {//也可以换成n%2 == 0
n >>= 1;
}
return n== 1;
}
解法二:利用数的二进制解法 (一般都是用在2的幂)
如果n为2的幂,那么n一定是10000000 之类的 而n-1 就是 01111111 那么n&(n-1) == 0 一定成立 否者n就不是2的幂
bool isPowerOfTwo(int n) {
if (n <= 0) return false;
return n&(n-1) == 0;
//如果n为2的幂,那么n一定是10000000 之类的 而n-1 就是 01111111 那么n&(n-1) == 0
//一定成立 否者n就不是2的幂
}
解法三:对数函数解法
如果n是2的幂 那么 log2(n) == (int)log2(n) [或者使用 是绝对值之差小于1e-6] 或者是 2^( log2(n) ) == n 也是一样的
hint:注意精度
1. 3的幂解法
解法一: 常规解法 (省略)
解法二:利用数的二进制解法 (3就不好用二进制解法了)
特殊解法:
3的幂次的质因子只有3,而所给出的n如果也是3的幂次,故而题目中所给整数范围内最大的3的幂次的因子只能是3的幂次,1162261467 (int范围内3的幂最大得数)是3的19次幂,是整数范围内最大的3的幂次
public boolean isPowerOfThree(int n) {
return n > 0 && 1162261467%n == 0;
}
解法三:对数函数解法
//python写法
public boolean isPowerOfThree(int n) {
return n>0 and 3**round(math.log(n,3))==n
}
1. 4的幂解法
解法一: 常规解法 (省略)
解法二:利用数的二进制解法
是4的幂就也一定是2的幂 所以 n&(n-1) == 0 {前提} 【最高位是1其他位置全是0】
如果是4的幂那个1一定是在二进制的奇位上 0x55555555 就是int32位中奇位上全为1的值 n&0x55555555 != 0 那么n就是4的幂
public boolean isPowerOfFour(int n) {
if (n <= 0 || n&(n-1) ) return false;
return n&0x55555555;
}
解法三:对数函数解法
//python写法
public boolean isPowerOfThree(int n) {
return n>0 and 4**round(math.log(n,4))==n
}