Java每日一题:丑数

题目描述:

给你一个整数 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 通常被视为丑数。

思路

  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; √
  1. 可以发现丑数判定方法:
  • 除数只能是2,3,5
  • 除到最后,当最后的除数出现2,3,5时则可以判断为丑数,出现了不能被这3个数整除的情况就不是丑数
  1. 迭代思路:
    这题首先想到的是迭代,原因是所得余数的判定和被除数判断方法一样;而这正式迭代的中心思想。
  • 迭代停止条件:结果出现了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));    
      	        }
      	        }
      	}
    
  • 这题的特殊情况要注意排除,一方面避免不必要判断,另一方面,迭代停止条件没有涉及负数情况,这会倒是无限迭代情况
  1. 递归思路
    有了迭代的铺垫,递归方法很简单:在指定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;  
             } 
         }
     }
    
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值