326.Power of Three
while循环解法

class Solution {
public:
    bool isPowerOfThree(int n) {
        while(n > 1)
        {
            if(n % 3 != 0)
                return false;
            
            n /= 3;
        }
        
        return (n == 1) ? true:false;
    }
};

循环解法更优解法:

class Solution {
public:
    bool isPowerOfThree(int n) {
        if(n < 1)
            return false;
        
        while(n % 3 == 0)
        {
            n /= 3;
        }
        
        return 1 == n;
    }
};

和第一种方法对比,这种方法运行效率更高。原因是把n > 1放在了循环外面(确实也只用判断一次)。
recursion递归解法

class Solution {
public:
    bool isPowerOfThree(int n) {
        if(n == 1)
            return true;
        if(n % 3 == 0 && n > 0)
            return isPowerOfThree(n/3);
        else
            return false;
    }
};

精炼的递归写法:

class Solution {
public:
    bool isPowerOfThree(int n) {
        return n > 0 && (n == 1 || (n % 3 == 0) && isPowerOfThree(n / 3));
    }
};

不使用while和递归的解法:
这种解法先找到3的n次方的最大值,然后最大值对n取余等于0则证明n是3的n次方。

class Solution {
public:
    int const Max3PowerInt = 1162261467; // 3^19, 3^20 = 3486784401 > MaxInt32
    int const MaxInt32 = 2147483647; // 2^31 - 1
    bool isPowerOfThree(int n) {
        if (n <= 0 || n > Max3PowerInt) 
            return false;
        return Max3PowerInt % n == 0;
    }
};

不使用循环和递归的另一种解法:

class Solution {
public:
    bool isPowerOfThree(int n) {
        return fmod(log10(n)/log10(3), 1) == 0;
    }
};

这种解法是利用对数去底数性质,返回余数(对1取余,观察是否有小树)