326. Power of Three

Power of Three 判斷3的次方數

Given an integer, write a function to determine if it is a power of three.

Follow up:
Could you do it without using any loop / recursion?

Credits:
Special thanks to @dietpepsi for adding this problem and creating all test cases.

這道題讓我們判斷一個數是不是3的次方數,3的次方數沒有顯著的特點,最直接的方法就是不停地除以3,看最後的餘數是否爲1,要注意考慮輸入是負數和0的情況,參見代碼如下:

解法一:

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

題目中的Follow up讓我們不用循環,那麼有一個投機取巧的方法,由於輸入是int,正數範圍是0-231,在此範圍中允許的最大的3的次方數爲319=1162261467,那麼我們只要看這個數能否被n整除即可,參見代碼如下:

解法二:

class Solution {
public:
    bool isPowerOfThree(int n) {
        return (n > 0 && 1162261467 % n == 0);
    }
};

最後還有一種巧妙的方法,利用對數的換底公式來做,高中學過的換底公式爲logab = logcb / logca,那麼如果n是3的倍數,則log3n一定是整數,我們利用換底公式可以寫爲log3n = log10n / log103,注意這裏一定要用10爲底數,不能用自然數或者2爲底數,否則當n=243時會出錯,原因請看這個帖子。現在問題就變成了判斷log10n / log103是否爲整數,在c++中判斷數字a是否爲整數,我們可以用 a - int(a) == 0 來判斷,參見代碼如下:

解法三:

class Solution {
public:
    bool isPowerOfThree(int n) {
        return (n > 0 && int(log10(n) / log10(3)) - log10(n) / log10(3) == 0);
    }
};
發佈了73 篇原創文章 · 獲贊 192 · 訪問量 78萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章