判斷給定正整數是否為醜數。醜數定義:質因子只包含 2、3、5。約定 1 為醜數,0 不是。
範例:
6 = 2 × 3 → true
8 = 2³ → true
14 = 2 × 7 → false (含因子 7)
1 → true
不斷嘗試除以 2、3、5:
終止條件:num == 1(true)、num == 0(false,防死循環)。
時間複雜度:O(log n),空間複雜度:O(log n)(遞歸棧,可改迭代 O(1))。
class Solution {
public:
bool isUgly(int num) {
if (num == 0) return false;
if (num == 1) return true;
if (num % 2 == 0) return isUgly(num / 2);
if (num % 3 == 0) return isUgly(num / 3);
if (num % 5 == 0) return isUgly(num / 5);
return false;
}
};
bool isUglyIterative(int num) {
if (num <= 0) return false;
while (num % 2 == 0) num /= 2;
while (num % 3 == 0) num /= 3;
while (num % 5 == 0) num /= 5;
return num == 1;
}
醜數判斷是「因子分解」最簡應用,掌握「除盡指定質因子,看剩餘是否為 1」通用模式,可擴展至「超級醜數」(LeetCode 313)等變體。