ugly number & ugly numberii

本文介绍了一种高效的算法来判断一个数是否为丑数,并详细解释了如何寻找第N个丑数的方法。通过使用三个指针跟踪最小丑数的生成过程,确保了算法的有效性和准确性。

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

一、判断一个数是不是丑数
三个循环,先除2,再除3,再除5,每当有余数就跳出循环,找出丑数中所有和2,3,5,有关的因子,如果最后结果为1,则为丑数。
注:非正数不是丑数,1是第一个丑数。


二、 判断第N个丑叔是几
创建一个数组存储丑数,声明三个指针分别代表因子2,3,5,并指向该数组。
先找出因子2,3,5自乘中最小的数,然后三个数组各自乘以各自的因子,当运算结果不大于当前丑叔时,指向自己数组的下一个元素(因为指针指向丑数数组,所以该元素为已经找到了前某个丑数,会跳过非丑数),直至找到第N个丑数。

AC代码

int nthUglyNumber1(int n) {
    int *uglys = new int[n];
    uglys[0] = 1;
    int *p2 = uglys, *p3 = uglys, *p5 = uglys, next = 1;
    while (next<n){
        int m = min(min(*p2 * 2, *p3 * 3), *p5 * 5);
        uglys[next] = m;
        while (*p2 * 2 <= m)
            *p2++;
        while (*p3 * 3 <= m)
            *p3++;
        while (*p5 * 5 <= m)
            *p5++;
        next++;
    }
    int rst = uglys[n - 1];
    delete[] uglys;
    return rst;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值