解題說明
Power of Three
題目描述:給定整數 n,判斷它是否為 3 的冪次方(即存在整數 x 使得 3^x = n)。
解題思路:最有趣的解法是數學法:在 32 位元有號整數範圍內,3 的最大冪次方為 3^19 = 1162261467。一個數是 3 的冪次方,若且唯若它能整除這個最大值(因為 3 是質數,3 的冪次方的因數只有 3 的更小冪次方)。迭代法:反覆將 n 除以 3,若最終為 1 則是冪次方。遞迴法:n == 1 為基礎情況,n % 3 == 0 且遞迴 n/3 也是冪次方。需注意 n <= 0 的邊界情況。
C++ 解法
複雜度分析
時間複雜度:O(1) — 數學法只做一次模運算,為常數時間。
空間複雜度:O(1) — 不需要任何額外空間。
虛擬碼
1. If n <= 0, return false 2. Return true if 3^19 (= 1162261467) % n == 0 Alternative iterative approach: 1. While n % 3 == 0: n = n / 3 2. Return n == 1
其他解法
迭代除法:while (n % 3 == 0) n /= 3; 最後判斷 n == 1。時間 O(log n),直觀易懂。
遞迴法:n > 0 && (n == 1 || (n % 3 == 0 && isPowerOfThree(n / 3)))。時間 O(log n),空間 O(log n) 堆疊。
對數法:計算 log(n) / log(3) 是否為整數,但浮點精度問題可能導致誤判,需額外驗算。
延伸思考
- 為何「最大冪次方整除法」只對質數底數(如 2、3、5)有效,對非質數底數(如 6、12)無效?
- 如何在不使用任何迴圈、遞迴和對數函數的情況下判斷 n 是否為 2 的冪次方?
- 如果題目改為判斷是否為任意給定底數
b的冪次方,哪種方法最通用且穩健?