2的幂
位运算
利用位运算:观察知2的幂二进制一定是0000100000格式的,减一以后得到的数所有位的数字一定都是1,直接判断
class Solution {
public:
bool isPowerOfTwo(int n) {
if(n<=0) return false;
int m=n-1;
while(m)
{
if(!(m&1)) return false;
m>>=1;
}
return true;
}
};
暴力循环
暴力一直除2
class Solution {
public:
bool isPowerOfTwo(int n) {
if(n<=0) return false;
while(n%2==0){
n/=2;
}
return n==1;
}
};
3的幂
用最大数判断倍数
观察知int范围内最大的3的幂次就是3的19次方,直接判断是不是其倍数(3是一个质数,也就是说3里面不包含其他因子,也就是说3的19次方中的因子一定只有3和3的幂)
class Solution {
public:
bool isPowerOfThree(int n) {
return n > 0 && 1162261467 % n == 0;
}
};
4的幂
换底公式
class Solution {
public:
bool isPowerOfFour(int n){
if(n <= 0) {
return false;
}
int x = (int)(log2(n) / log2(4) + 1e-8);
return fabs(n - pow(4, x)) < 1e-8;
}
};