263. Ugly Number(丑数)

本文介绍了如何使用两种方法判断一个正整数是否为丑数,即只包含质因数2、3和5的数。方法一是通过素数筛筛选并验证因子,可能会超时;方法二是利用除法简化过程,确保不会超时,核心在于不断除以2、3、5直到结果为1。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

题目描述

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

问题分析

有两种方法可以求解此问题,一种是,通过素数筛筛选出所有小于等于n的素数,然后对这些素数一一验证是否是n的因子,如果是n的因子,判断是否为2、3、5.这样最终就能知道此数是否为丑数。
第二种方法是,根据算术基本定理,任何一个数都可以分解成素数的乘积的形式即n=p1x1∗p2x2∗p3x3∗p4x4∗......n = p_1^{x_1}*p_2^{x_2}*p_3^{x_3}*p_4^{x_4}*......n=p1x1p2x2p3x3p4x4......也就是说,如果一个数是丑数那么此数必定可以写作n=2x1∗3x2∗5x3n = 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;
}

运行结果截图

在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值