• leetcode-263-Ugly Number


    题目描述:

    Write a program to check whether a given number is an ugly number.

    Ugly numbers are positive numbers whose prime factors only include 2, 3, 5. For example, 6, 8 are ugly while 14 is not ugly since it includes another prime factor 7.

    Note:

    1. 1 is typically treated as an ugly number.
    2. Input is within the 32-bit signed integer range.

     

    要完成的函数:

    bool isUgly(int num) 

    说明:

    1、这道题目不难理解。一个只包括2、3、5的素数因子的正数是ugly number,1特别处理为ugly number。输入是一个32位的有符号型整数。

    2、首先我们在想这道题目能不能不断地整除2、整除3、整除5,最后等于1,就判断是一个ugly number。如果整除完还是不等于1,就不是ugly number。

    但题目中说的是素数因子,那要是包含一些非素数因子,比如偶数、奇数中的合数呢?

    偶数不用说,总是能整除2的。奇数中的合数,也是由素数相乘而构成的,比如15=3*5,27=3*3*3,21=3*7,所以奇数中的合数也能不断地整除2、整除3、整除5,然后看是不是最终等于1来判断。

    所以这道题目,按照我们最开始的思路,是可以处理的。

    代码如下:

        bool isUgly(int num) 
        {
            if(num<=0)//边界条件处理
                return false;
            while(num%2==0)   num>>=1;//位操作更加便于计算机处理,且更快
            while(num%3==0)   num/=3;
            while(num%5==0)   num/=5;
            return num==1;//如果num==1,那么直接返回true
        }

    实测6ms,beats 77.79% of cpp submissions。

    3、受到昨天那道“判断一个数是不是2的整数次幂”的题目的启发,笔者在想能不能找到一个最大的整数,它包含了2、3、5的因子,然后判断这个最大整数能否整除num,从而判断是不是ugly number。

    但是这个最大整数必定是远远超过int型整数所能表示的范围,它需要30个2的因子(int型整数所能拥有最多的2因子),19个3的因子(int型整数所能拥有最多的3因子),13个5的因子(int型整数所能拥有最多的5因子)。

    接着判断这个最大整数是否能整除num,就可以做出一个时间复杂度为O(1)的判断了,只需要做一次大数除法。

    不过大数除法似乎本身时间复杂度也挺高的……可能到最后实际上还没有2中的做法快。

    个人的一点想法。

     

  • 相关阅读:
    hdu 5115 区间dp ***
    CF 149D Coloring Brackets 区间dp ****
    区间dp总结
    hdu 5284 BestCoder Round #48 ($) 1001 水题 *
    vijos 1038 括号+路径 ***
    vijos 1037 ***
    vijos 1028 LIS *
    使用alpine 构建 golang 运行容器
    Go Http包解析:为什么需要response.Body.Close()
    如果open的file不close , 会有什么样的影响
  • 原文地址:https://www.cnblogs.com/chenjx85/p/8847373.html
Copyright © 2020-2023  润新知