UVA 136 Ugly Numbers

本文介绍了一种使用优先队列和集合去重的方法,来寻找第1500个丑数(只能被2、3、5整除的正整数)。通过不断生成并筛选丑数,最终输出目标数值。

题意:求第1500个丑数(不能被2,3,5以外的其他素数整除的数)。

思路:从小到大生成各个丑数,最小的丑数是1,对于任意丑数x,2x,3x,5x都是丑数;

因此利用优先队列保存已经生成的丑数,每次取出最小的丑数,生成3个新的丑数;

但要注意去重,比如2,3都会生成6,于是用set来存、判断重复。

 1 //The 1500'th ugly number is<number>.
 2 #include "iostream"
 3 #include "set"
 4 #include "vector"
 5 #include "queue"
 6 #include "functional"
 7 using namespace std;
 8 typedef long long LL;
 9 int main()
10 {
11     set<LL> s;
12     priority_queue<LL, vector<LL>, greater<LL> >pq;//从小到大
13     int cof[3] = { 2,3,5 };
14     s.insert(1);
15     pq.push(1);
16     for (int i = 1;; i++)
17     {
18         LL x = pq.top();//取最小的
19         //cout << "x=" << x << endl;
20         pq.pop();
21         if (i == 1500)
22         {
23             //输出
24             cout << "The 1500'th ugly number is "<< x<< ".\n";
25             break;
26         }
27         
28         for (int j = 0; j < 3; j++)
29         {
30             LL x2;
31             x2 = x*cof[j];
32             if (!s.count(x2))//去重
33             {
34                 s.insert(x2);
35                 pq.push(x2);
36             }
37         }
38     }
39     return 0;
40 }
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值