263. Ugly Number(丑数)

题目描述

丑数 就是只包含质因数 2、3 和 5 的正整数。
给你一个整数 n ,请你判断 n 是否为 丑数 。如果是,返回 true ;否则,返回 false 。

问题分析

有两种方法可以求解此问题,一种是,通过素数筛筛选出所有小于等于n的素数,然后对这些素数一一验证是否是n的因子,如果是n的因子,判断是否为2、3、5.这样最终就能知道此数是否为丑数。
第二种方法是,根据算术基本定理,任何一个数都可以分解成素数的乘积的形式即 n = p 1 x 1 ∗ p 2 x 2 ∗ p 3 x 3 ∗ p 4 x 4 ∗ . . . . . . n = p_1^{x_1}*p_2^{x_2}*p_3^{x_3}*p_4^{x_4}*...... n=p1x1p2x2p3x3p4x4......也就是说,如果一个数是丑数那么此数必定可以写作 n = 2 x 1 ∗ 3 x 2 ∗ 5 x 3 n = 2^{x_1}*3^{x_2}*5^{x_3} n=2x13x25x3也就是说,n在有限次除去2、3、5之后必定为1,所以就可以根据此来判读是否为丑数。

代码

方法一:会超时

bool isUgly(int n) {
    if(n<1){
        return false;
    }
    int *num = (int *)malloc(sizeof(int)*(n+1));
    for(int i = 0; i <= n; i++){
        num[i] = 1;
    }
    for(int i=2; i<=n; i++){
        if(num[i]!=0){
            if(n%i==0&&i!=2&&i!=3&&i!=5){
                return false;
            }
            for(int j = i*2; j<=n; j+=i){
                num[j] = 0;
            }
        }
    }
    return true;
}

方法二:不会超时

bool isUgly(int n) {
    if(n<1){
        return false;
    }
    while(n%2==0){
        n/=2;
    }
    while(n%3==0){
        n/=3;
    }
    while(n%5==0){
        n/=5;
    }
    return n==1;
}

运行结果截图

263. Ugly Number(丑数)_第1张图片

你可能感兴趣的:(leetcode刷题日记,刷题)