【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;
    }
};

 

posted @ 2018-01-16 13:25  Sherry_Yang  阅读(120)  评论(0编辑  收藏  举报