例题5-7 丑数(Ugly Numbers,Uva 136)题解

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/richenyunqi/article/details/86500309

欢迎访问我的Uva题解目录哦 https://blog.csdn.net/richenyunqi/article/details/81149109

题目描述

例题5-7 丑数(Ugly Numbers,Uva 136)题目描述

题意解析

丑数是指不能被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;
}

猜你喜欢

转载自blog.csdn.net/richenyunqi/article/details/86500309
今日推荐