UVa 136 - Ugly Numbers

本文探讨了寻找第1500个丑数的三种不同算法实现:直接判断法、改进版直接判断法及优先队列法。通过对比分析,展示了高效算法的设计思路。

仅仅几行代码就能搞定。



#include<iostream>
using namespace std;

int main() {
    cout << "The 1500'th ugly number is 859963392." << endl;
    return 0;
}

百度一个数就OK了。哈哈。

好吧,上面是开玩笑,现在切入正题。


很容易就想到的办法。



#include<iostream>
#define MAXN 2000
using namespace std;

typedef unsigned long long LL;

bool ugly_num(LL x) {
    if(x == 1)
        return true;
    if(!(x % 2))
        return ugly_num(x / 2);
    if(!(x % 3))
        return ugly_num(x / 3);
    if(!(x % 5))
        return ugly_num(x / 5);
    return false;
}

int main() {
    LL i, j, uglynum[MAXN];
    j = 1;
    for(i = 1; j <= 1500; i++) {
        if(ugly_num(i)) {
            uglynum[j] = i;
            j++;
        }
    }
    cout << "The 1500'th ugly number is " << uglynum[1500] << "."
     << endl;
    return 0;
}


如果这么写,恭喜TLE。

那么换种方法。

只能被2, 3, 5整除的才是丑数,那么从1开始乘2, 3, 5,让乘完后最小的再乘2, 3, 5。第1500次即为所求。



#include<iostream>
#include<queue>
#include<set>
using namespace std;

typedef unsigned long long LL;

int k[5] = {2, 3, 5};

int main() {
    priority_queue<LL, vector<LL>, greater<LL> > q;
    set<LL> s;
    q.push(1);
    s.insert(1);
    for(int i = 1; i < 1500; i++) {
        LL t = q.top();
        q.pop();
        for(int j = 0; j < 3; j++)
            if(!s.count(t * k[j])) {
                q.push(t * k[j]);
                s.insert(t * k[j]);
        }
    }
    cout << "The 1500'th ugly number is " << q.top() << "." << endl;
    return 0;
}



转载于:https://www.cnblogs.com/xuziye0327/p/4249285.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值