版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/richenyunqi/article/details/86500309
欢迎访问我的Uva题解目录哦 https://blog.csdn.net/richenyunqi/article/details/81149109
题目描述
题意解析
丑数是指不能被2,3,5以外的其他素数整除的数。把丑数从小到大排列起来,求第1500个丑数。
算法设计
借鉴了《算法竞赛与入门经典》中的解法:
最小的丑数是1,而对于任意丑数x,2x、3x和5x也都是丑数。这样,就可以用一个优先队列保存所有已生成的丑数,每次取出最小的丑数,生成3个新的丑数。唯一需要注意的是,同一个丑数有多种生成方式,所以需要判断一个丑数是否已经生成过。
判断一个丑数是否已经生成过,这一点可以用set来实现
注意点
第1500个丑数已经超出int的存储范围,要用long long 来存储
C++代码
#include<bits/stdc++.h>
using namespace std;
int main(){
long long a[3]={2,3,5},ans=0;
set<long long>s;
priority_queue<long long,vector<long long>,greater<long long>>pq;//用小顶堆实现的优先级队列
pq.push(1);
s.insert(1);
for(int i=0;i<1500;++i){
ans=pq.top();
pq.pop();
for(int j=0;j<3;++j)
if(s.find(a[j]*ans)==s.end()){//该丑数未被生成过
s.insert(a[j]*ans);
pq.push(a[j]*ans);
}
}
printf("The 1500'th ugly number is %d.\n",ans);
return 0;
}