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;        
        }
  • 相关阅读:
    ASP.NET中常用服务器端与客户端交互!
    使用WebDeployment Project改善VS2005发布网站问题 (一) 基础
    MSN改密码
    Ajax学习(一)
    Visual Studio2005 + Visual SourceSafe 2005 实现团队开发、源代码管理、版本控制
    手把手教你如何配置和编译ogre 1.7.0 + cegui 0.7.1
    What's Coming in the June 2010 DirectX SDK
    黄仁勋:相信你正在做的事。
    [转载] 翻译 西川善司著针对3D游戏爱好者的”METAL GEAR SOLID 4”图形讲座(下)
    glPushAttrib里的各个BIT都save了些什么
  • 原文地址:https://www.cnblogs.com/weizhibin1996/p/9669848.html
Copyright © 2011-2022 走看看