题目:丑数
给你一个整数n
,请你判断n
是否为 丑数 。如果是,返回true
;否则,返回false
。
丑数 就是只包含质因数 2、3 和 5 的正整数。
- 示例 1:
输入:n = 6
输出:true
解释:6 = 2 × 3
- 示例 2:
输入:n = 8
输出:true
解释:8 = 2 × 2 × 2
- 示例 3:
输入:n = 14
输出:false
解释:14 不是丑数,因为它包含了另外一个质因数 7 。
- 示例 4:
输入:n = 1
输出:true
解释:1 通常被视为丑数。
- 提示:
-2^31 <= n <= 2^31 - 1
思路
把只包含质因子2
,3
和5
的数称作丑数。
需要注意的是,0 和负数都不是丑数。因为 0 的因数没有 2、3、5;而负数的因数中一定有一个负数,所以因数不仅仅是 2、3、5。
若 n <= 0,则一定不是丑数,返回 false。
若 n % 2 == 0,则说明 2 是 n 的因子,此时应 n /= 2,然后继续判断 n 除以 2 后的值的因子。
若 n % 3 == 0,则说明 3 是 n 的因子,此时应 n /= 3,然后继续判断 n 除以 3 后的值的因子。
若 n % 5 == 0,则说明 5 是 n 的因子,此时应 n /= 5,然后继续判断 n 除以 5 后的值的因子。
最后,若 n == 1,则说明 n 中的因子只有 2,3 和 5,即 n 是丑数;否则,n 不是丑数。
代码
public boolean isUgly(int n) { // 总时间复杂度O(n)
// 小于0,必包含负数质因数(不属于2,3,5),不是丑数;0没有质因子,不是丑数
if (n <= 0) {
return false;
}
// 能被2除尽,继续除,直到除不尽
while (n % 2 == 0) { // 时间复杂度O(n)
n = n / 2;
}
// 能被3除尽,继续除,直到除不尽
while (n % 3 == 0) { // 时间复杂度O(n)
n = n / 3;
}
// 能被5除尽,继续除,直到除不尽
while (n % 5 == 0) { // 时间复杂度O(n)
n = n / 5;
}
if (n == 1) { // 若 n == 1,则说明 n 中的因子只有 2,3 和 5,即 n 是丑数
return true;
} else {
return false;
}
}