263.ugly-number.md 2.0 KB
Newer Older
L
luzhipeng 已提交
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92
## 题目地址

https://leetcode.com/problems/ugly-number/description/

## 题目描述

```
Write a program to check whether a given number is an ugly number.

Ugly numbers are positive numbers whose prime factors only include 2, 3, 5.

Example 1:

Input: 6
Output: true
Explanation: 6 = 2 × 3
Example 2:

Input: 8
Output: true
Explanation: 8 = 2 × 2 × 2
Example 3:

Input: 14
Output: false 
Explanation: 14 is not ugly since it includes another prime factor 7.
Note:

1 is typically treated as an ugly number.
Input is within the 32-bit signed integer range: [−231,  231 − 1].

```

## 思路

题目要求给定一个数字,判断是否为“丑陋数”(ugly number), 丑陋数是指只包含质因子2, 3, 5的正整数。

![263.ugly-number](../assets/problems/263.ugly-number.png)

根据定义,我们将给定数字除以2、3、5(顺序无所谓),直到无法整除。
如果得到1,说明是所有因子都是2或3或5,如果不是1,则不是丑陋数。

这就好像我们判断一个数字是否为n(n为大于1的正整数)的幂次方一样,我们只需要
不断除以n,直到无法整除,如果得到1,那么就是n的幂次方。   这道题的不同在于
它不再是某一个数字的幂次方,而是三个数字(2,3,5),不过解题思路还是一样的。

转化为代码可以是:

```js

  while(num % 2 === 0)   num = num / 2;
  while(num % 3 === 0)   num = num / 3;
  while(num % 5 === 0)   num = num / 5;

  return num === 1;

```

> 我下方给出的代码是用了递归实现,只是给大家看下不同的写法而已。

## 关键点
- 数论
- 因数分解
## 代码

```js

/*
 * @lc app=leetcode id=263 lang=javascript
 *
 * [263] Ugly Number
 */
/**
 * @param {number} num
 * @return {boolean}
 */
var isUgly = function(num) {
  // TAG: 数论
  if (num <= 0) return false;
  if (num === 1) return true;

  const list = [2, 3, 5];

  if (list.includes(num)) return true;

  for (let i of list) {
    if (num % i === 0) return isUgly(Math.floor(num / i));
  }
  return false;
};
```