【easy】power of 2,3,4
============================== 2的幂次 ================================
最佳解法
如果一个数是2的次方数的话,根据上面分析,那么它的二进数必然是最高位为1,其它都为0,那么如果此时我们减1的话,则最高位会降一位,其余为0的位现在都为变为1,那么我们把两数相与,就会得到0,用这个性质也能来解题,而且只需一行代码就可以搞定,如下所示:
class Solution { public: bool isPowerOfTwo(int n) { return (n > 0) && (!(n & (n - 1))); } };
递归
public boolean isPowerOfTwo(int n) { if(n==1) return true; if(n>=2 && n%2==0) return isPowerOfTwo(n/2); return false; }
位运算
public bool isPowerOfTwo(int n) { if(n<=0) return false; return countBit(n)==1; } public int countBit(int num){ int count=0; while(num!=0){ count += (num & 1); num >>= 1; } return count; }
======================================= 3的幂次 ====================================
//一个基本的事实就是如果n是3的x次方,那么以3为底对数后一定是一个整数,否则不是 //还有枚举法,枚举所有可能的int范围内的3的幂次 class Solution { public: bool isPowerOfThree(int n) { double res = log10(n) / log10(3); //有精度问题,不要用以指数2.718为低的log函数 return (res - int(res) == 0) ? true : false; } };
题目不建议,但是用迭代是可以解的:如果一个数是3的x次方那么,反复除以3,最终一定等于1,return true
class Solution { public: bool isPowerOfThree(int n) { int num=n; while(num>0 && num%3==0) num/=3; return num==1; } };
=================================== 4的幂次 ==========================================
自己的笨办法:如果是4的幂次,那么二进制只有一个1,0的个数为2,4,6,8等偶数
class Solution { public: bool isPowerOfFour(int num) { if (num<1) return false; if (num==1) return true; int count_zero = 0; int count_one = 0; while(num!=0){ if ((num & 1)==0) count_zero ++; else count_one ++; num >>= 1; } if (count_one != 1 || count_zero <2) return false; if (count_zero%2==0) return true; else return false; } };
不符合要求的递归写法
class Solution { public: bool isPowerOfFour(int num) { while (num && (num % 4 == 0)) { num /= 4; } return num == 1; } };
用log的换底公式来做
class Solution { public: bool isPowerOfFour(int num) { return num > 0 && int(log10(num) / log10(4)) - log10(num) / log10(4) == 0; } };
首先根据Power of Two中的解法二,我们知道num & (num - 1)可以用来判断一个数是否为2的次方数,更进一步说,就是二进制表示下,只有最高位是1,那么由于是2的次方数,不一定是4的次方数,比如8,所以我们还要其他的限定条件,我们仔细观察可以发现,4的次方数的最高位的1都是计数位,那么我们只需与上一个数(0x55555555) <==> 1010101010101010101010101010101,如果得到的数还是其本身,则可以肯定其为4的次方数:
class Solution { public: bool isPowerOfFour(int num) { return num > 0 && !(num & (num - 1)) && (num & 0x55555555) == num; } };
或者我们在确定其是2的次方数了之后,发现只要是4的次方数,减1之后可以被3整除:
class Solution { public: bool isPowerOfFour(int num) { return num > 0 && !(num & (num - 1)) && (num - 1) % 3 == 0; } };