zoukankan      html  css  js  c++  java
  • 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;        
        }
  • 相关阅读:
    HDU 5023 A Corrupt Mayor's Performance Art(线段树区间更新)
    CSU 1120 病毒(DP)
    CSU 1116 Kingdoms(枚举最小生成树)
    一种map容器遍历的方法
    CSU 1113 Updating a Dictionary(map容器应用)
    Python模块-virtualenv-虚拟环境
    计算学习原理
    sklearn-特征工程之特征选择
    链家网深圳租房信息分析报告
    test
  • 原文地址:https://www.cnblogs.com/weizhibin1996/p/9669848.html
Copyright © 2011-2022 走看看