4 的幂
问题:
给定一个整数,写一个函数来判断它是否是 4 的幂次方。如果是,返回true
;否则,返回false
。
整数 n 是 4 的幂次方需满足:存在整数 x 使得
n == 4x
思路:
思路 1
如果所给整数小于等于 0 直接返回 0;
如果所给整数大于 0,且是 4 的倍数(先确保它可能成为 4 的幂),然后不断将 n / 4, 最后 n 如果变为 1 则证明 n 是 4 的幂,返回 1。思路 2
4 的幂一定是 2 的幂,如果(n & (n - 1))== 0
则证明 n 为 2 的幂,且n % 3 == 1
的话就一定是 4 的幂。思路 3
如果 n 是 4 的幂,那么 n 的二进制表示中有且仅有一个 1,并且这个 1 出现在从低位开始的第偶数个二进制位上(这是因为这个 11 后面必须有偶数个 0)。
所以写出与之相对的二进制数 m = 10101010101010101010101010101010 = 0xaaaaaaaa H。
和它与后结果为 0 则为 4 的幂。
// Solution1
class Solution {
public:
bool isPowerOfFour(int n) {
if(n <= 0) return 0;
while(n != 1) {
if(n % 4 == 0) {
n /= 4;
}
else return 0;
}
return 1;
}
};
// Solution2
class Solution {
public:
bool isPowerOfFour(int n) {
return n > 0 && (n & (n - 1)) == 0 && n % 3 == 1;
}
};
时间复杂度:O(1)
时间复杂度:O(1)
// Solution3
class Solution {
public:
bool isPowerOfFour(int n) {
return n > 0 && (n & (n - 1)) == 0 && (n & 0xaaaaaaaa) == 0;
}
};
时间复杂度:O(1)
时间复杂度:O(1)