题目描述:
给你一个整数 n ,请你判断 n 是否为 丑数 。如果是,返回 true ;否则,返回 false 。(丑数 就是只包含质因数 2、3 和/或 5 的正整数。)
来源:力扣(LeetCode)
示例 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 通常被视为丑数。
思路
- 首先举几个例子:14 ,12,16,45
- 14 = 2 × 7; ×
- 12 = 2 × 6;→6=2×3; √
- 16 = 2× 8; →8=2×4;→ 4=2×2; √
- 45 = 3×15;→15=3×5; √
- 可以发现丑数判定方法:
- 除数只能是2,3,5
- 除到最后,当最后的除数出现2,3,5时则可以判断为丑数,出现了不能被这3个数整除的情况就不是丑数
- 迭代思路:
这题首先想到的是迭代,原因是所得余数的判定和被除数判断方法一样;而这正式迭代的中心思想。
- 迭代停止条件:结果出现了2、3、5
- 迭代的范围:能被2、3、5整除的数
- 于是可得到:
-
class Solution { public boolean isUgly(int n) { if(n<=0) return false; // 排除特殊情况,减少不必要的判断 else{ if ((n==2) || (n==3) ||(n ==5) ||( n==1)) return true; / return ( (n%2==0)&&isUgly(n/2) ) || ( (n%3==0 )&&isUgly(n/3) ) || ((n%5==0)&&isUgly(n/5)); } } }
- 这题的特殊情况要注意排除,一方面避免不必要判断,另一方面,迭代停止条件没有涉及负数情况,这会倒是无限迭代情况
-
递归思路
有了迭代的铺垫,递归方法很简单:在指定3个被除数情况下不断除下去,直到出现了2,3,5。倘若没有出现(即最后被除数不是2,3,5,则不是丑数)。class Solution { public boolean isUgly(int n) { boolean flag= false ; if(n<=0) return false; else{ while( (n%2==0)||(n%3==0)||(n%5==0) ){ if ( (n==2)||(n==3)||(n==5)||(n==1) ) { flag = true; break; } else{ if(n%2==0) n=n/2; else if(n%3==0) n=n/3; else if(n%5==0) n=n/5; } } return flag; } } }