题解
整数幂
1 条题解
-
0
解题思路
判断一个数 n 是不是 2 的整数幂,也就是能不能写成 2 的某次方,比如 64 = 2^6。
先看二进制的特点:
- 1 写成二进制是 1
- 2 写成二进制是 10
- 4 写成二进制是 100
- 8 写成二进制是 1000
发现了吗?2 的幂在二进制里只有一位是 1,其余全是 0。
再看一个巧妙的性质:如果 n 是 2 的幂,比如 8,那么 n-1 = 7,写成二进制是 0111。把 1000 和 0111 做"按位与"(&),每一位上 1&0 都得 0,结果一定是 0。
反过来,如果 n 不是 2 的幂,那么 n 和 n-1 一定还有某一位同时是 1,按位与的结果就不是 0。
所以判断方法很简单:
- n > 0(2 的幂都是正数)
- 并且 (n & (n - 1)) == 0
满足这两个条件,就是 2 的整数幂,输出 "yes",否则输出 "no"。
参考代码
// 用途:判断一个整数n是不是2的整数幂 // 技巧:2的幂的二进制只有一个1,n和n-1按位与为0 #include <iostream> using namespace std; int main() { int n; cin >> n; if (n > 0 && (n & (n - 1)) == 0) cout << "yes"; // n>0且n&(n-1)==0 else cout << "no"; return 0; }复杂度分析
只需要做一次按位与运算,时间复杂度是 O(1)。不管 n 有多大(在 int 范围内),程序都能瞬间判断出来。
- 1