题目
编写一个函数,检查给定的一个数是否丑陋数。
丑陋数是一个正数,它的素数因子只包含 2、3、5。
示例:
6、8 是丑陋数,14 不是,因为 14 包含 7 这个素数因子。
注意:1 认为是丑陋数。
难度:容易
编程语言:C++
分析
程序框架为:
1 2 3 4 5 6
| class Solution { public: bool isUgly(int num) { } };
|
我们知道,任何一个大于 1 的正数总能分解为一串素数因子的乘积,而且这些素数因子按大小排列之后,写法只有一种方式。即是说,如果 n 能分解为仅包含 2、3、5 的乘积,就不能分解为包含 7 和其它素数因子的乘积。那么问题就转化为:对于给定的 n,能不能分解为仅包含 2、3、5 的乘积。
基本思路是递归:
- 如果 n 能整除 2,判断 m = n / 2 是否丑陋数
- 如果 m 是丑陋数,说明 m 能分解为 2、3、5 的乘积,那么 n 也是丑陋数
- 如果 m 不是丑陋数,说明 m 的素数因子乘积里包含非 2、3、5 的素数,那么 n 也不是丑陋数
- 如果 n 不能整除 2,说明 n 的素数因子乘积里不包含 2,那么看是否仅包含 3、5
- 如果 n 能整除 3,判断 m = n / 3 是否丑陋数
- 如果 n 不能整除 2、3,说明 n 的素数因子乘积里不包含 2、3,那么看是否仅包含 5
- 如果 n 能整除 5,判断 m = n / 5 是否丑陋数
代码如下:
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
| #include <iostream> using namespace std; class Solution { public: bool isUgly(int n) { if (n < 1) { return false; } if (n == 1) { return true; } // 判断 n 的素数因子乘积是否仅包含 2、3、5 if (n % 2 == 0) { return isUgly(n / 2); } // 判断 n 的素数因子乘积是否仅包含 3、5 if (n % 3 == 0) { return isUgly(n / 3); } // 判断 n 的素数因子乘积是否仅包含 5 if (n % 5 == 0) { return isUgly(n / 5); } // n 的素数因子乘积不包含 2、3、5 return false; } }; int main() { Solution sol; cout << sol.isUgly(6) << endl; cout << sol.isUgly(8) << endl; cout << sol.isUgly(14) << endl; }
|
提交到 Leetcode,Accepted! :) 运行时间为 8ms。