2的幂c
给你一个整数 n,请你判断该整数是否是 2 的幂次方。如果是,返回 true ;否则,返回 false 。
如果存在一个整数 x 使得 n == 2x ,则认为 n 是 2 的幂次方。
示例 1:
输入:n = 1
输出:true
解释:20 = 1
示例 2:
输入:n = 16
输出:true
解释:24 = 16
示例 3:
输入:n = 3
输出:false
提示:
-231 <= n <= 231 - 1
bool isPowerOfTwo(int n) { //暴力算法,没啥说的 int z=2; bool a=false; for(int i=0;i<100000;i++) { if(n==pow(z,i)) { a=true; break; } } return a; }
bool isPowerOfTwo(int n) { //虽然也暴力,但是循环少,时间短些 bool flag=true; if(n==0) return false; while(n!=1)//1直接可为true { if(n%2==0) n/=2;//缩小n,控制条件 else {flag=false; break;} } return flag; }
真正nb的还得是位运算
二进制特性:
所有2的幂次方数(如4=100₂,8=1000₂)二进制有且仅有一个1
n-1会将唯一1位变为0,后续位全变1(如8-1=7→0111₂)
位运算验证:
n & (n-1) 操作会消除最后一个1
当且仅当结果为0时,原始数只有一个1位
常见的判断2的幂的方法是利用位运算,尤其是利用n & (n-1)是否等于0的特性。
n & (n-1)会消除最低位的1,当结果为0时证明原数只有一个1
比如当n是8时,二进制是1000,n-1是0111,相与后结果是0。而如果n不是2的幂,比如7,二进制是0111,n-1是0110,相与后结果不是0。
bool isPowerOfTwo(int n) { return n >0 && (n & (n-1)) == 0;//只能说nb }
(1162261467 % n) == 0;
这种思想也不错,用二进制减少时间,还有直接可以确定n是不是;利用幂的特性。
二进制运算大于递归大于循环。

浙公网安备 33010602011771号