LeetCode263-丑数(数学智力题)

看了答案才发现,这个题目这么简单。

 

这个题目隐含的意思很坑,

除了2、3、5,不能有别的质数了,比如2x7 = 14,7是质数,不行。

 

2x25可以 因为25不是质数

 

所以我就想到

一个数,看能否被2整除,如果可以

1、这个商是质数吗? 如果是质数,那么是2、3、5吗?是就是true,不是就是false

2、如果不是质数,就判断这个商是不是丑数。递归

 

后面对3和5也是这样处理。

 

首先是判断质数的方法

就是num%i 一直到根号nums

 

https://blog.csdn.net/huang_miao_xin/article/details/51331710

在网上,多了一种方法。

如果一个数 不是6的倍数相邻的数,肯定不是质数。 不能反推

public class LeetCode263 {

    public static void main(String[] args) {
        System.out.println(isUgly(50));
    }

    public static boolean isPrime(int n){

        if (n==1||n==2||n==3||n==5)
            return true;

        if(!(n%6==1||n%6==5)){
            return false;
        }

        int temp = (int)Math.sqrt(n);

        //必须是=,不然25,可以55 25
        for(int i=2;i<=temp;i++){
            if (n%i==0)
                return false;
        }

        return true;

    }

    public static boolean isUgly(int num) {

        if(num<=0)
            return false;

        if (num==1||num==2||num==3||num==5)
            return true;

        boolean result = false;

        if(num%2==0){
            //如果是质数,看是不是2、3、5
            int temp = num/2;
          if(isPrime(temp)){
              if(temp==2||temp==3||temp==5){
                  return true;
              }else {
                  return false;
              }
          }else {
              //如果不是质数,那看看这个数是不是丑数
              result = isUgly(num/2);
          }
        }

        if (result){
            return true;
        }else {
            if(num%3==0){
                //如果是质数,看是不是2、3、5
                int temp = num/3;
                if(isPrime(temp)){
                    if(temp==2||temp==3||temp==5){
                        return true;
                    }else {
                        return false;
                    }
                }else {
                    result = isUgly(num/3);
                }
            }
        }

        if (result){
            return true;
        }else {
            if(num%5==0){
                //如果是质数,看是不是2、3、5
                int temp = num/5;
                if(isPrime(temp)){
                    if(temp==2||temp==3||temp==5){
                        return true;
                    }else {
                        return false;
                    }
                }else {
                    result = isUgly(num/5);
                }
            }
        }

        return result;


    }

}

 

太慢了

 

 

 

其实忘了一个条件,这个商,肯定也是2、3、5组合得来的。

所以丑数就是

 

2a x 3b x 5c

只有这里面,没有别的质数就好了。但是2、3、5构成的,怎会是质数呢?

所以最后就是

public boolean isUgly(int num) {
        if(num<=0) return false;
        if(num==1) return true;
        while(num%2==0)
             num/=2;
        while(num%3==0)
             num/=3;
        while(num%5==0)
             num/=5;
        return (num==1)?true:false;        
    }

 

posted @ 2018-09-18 16:47  朋友圈  阅读(460)  评论(0编辑  收藏  举报