题目翻译:
判断一个数是否是2的幂
分析:DONE
思路首先:
如果一个数是2的某个次方,那么他一定不会小于等于0(最多无限接近0)
如果n是2的某个次方,那么他的二进制形式一定是10000......这样的形式
并且n-1的二进制形式一定是01111....,进行与运算一定是00000......0,即false
class Solution {
public:
bool isPowerOfTwo(int n) {
if(n <= 0)
return false;
if(n&n-1)
return false;
else
return true;
}
};
或者更加直白的写法:
class Solution {
public:
bool isPowerOfTwo(int n) {
int i=0;
while(true)
{
if(pow(2,i)==n)
return true;
if(pow(2,i)>n)
return false;
if(pow(2,i)<n)
i++;
}
}
};
不用任何循环或者递归:
1,4294967296是2的32次方(整数中最大的2次方了),任何一个2的i次方均可被整除,否则.......
class Solution {
public:
bool isPowerOfTwo(int n) {
return n>0?!(4294967296 % n):0;
}
};
2,或者直接列举32个数(2的0次方,2的1次方,2的2次方.......2的32次方)这里就不在累述
3,或者采用log函数,来做
如果n是2的某个整数次方则res与int(res)完全相等,否则不等.....
class Solution {
public:
bool isPowerOfTwo(int n) {
double res = log10(n) / log10(2); //有精度问题,不要用log
return (res - int(res) == 0) ? true : false;
}
};
342. Power of Four
Given an integer (signed 32 bits), write a function to check whether it is a power of 4.
Example:
Given num = 16, return true. Given num = 5, return false.
Follow up: Could you solve it without loops/recursion?
Credits:
Special thanks to @yukuairoy for adding this problem and creating all test cases.
Subscribe to see which companies asked this question
分析:
老题目了!分析略。
方法1:
反复相除。时间复杂度o(lg(n))
class Solution {
public:
bool isPowerOfFour(int num) {
while(num>0 && num%4==0)
num/=4;
return num==1;
}
};
方法2:
log函数取对数
class Solution {
public:
bool isPowerOfFour(int num) {
double res = log10(num) / log10(4); //有精度问题,不要用以指数2.718为低的log函数
return (res - int(res) == 0) ? true : false;
}
};
方法3:
位运算,没有方法1快呢!
class Solution {
public:
bool isPowerOfFour(int num) {
if (num <= 0)
return false;
//(num & (num-1)) == 0这个条件有可能是2的幂产生的。
//(num & 0x55555555) != 0这个条件为的是铲除2的幂
if ( (num & (num-1)) == 0 && (num & 0x55555555) != 0 )
return true;
return false;
}
};
联动同类题目
<LeetCode OJ> 326. Power of Three,http://blog.csdn.net/ebowtang/article/details/50485622
注:本博文为EbowTang原创,后续可能继续更新本文。如果转载,请务必复制本条信息!
原文地址:http://blog.csdn.net/ebowtang/article/details/50364699
原作者博客:http://blog.csdn.net/ebowtang