263.丑数


题目:丑数

给你一个整数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

思路

把只包含质因子235的数称作丑数。

需要注意的是,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;
    }
}

文章作者: cxyexe
版权声明: 本博客所有文章除特別声明外,均采用 CC BY 4.0 许可协议。转载请注明来源 cxyexe !
  目录