uva 136 ——Ugly Numbers

来源:互联网 发布:网络机顶盒看直播 编辑:程序博客网 时间:2024/06/15 14:37

题目链接:点击打开链接

题意:从小到大,不能被(2,3,5)以外的素数整除的丑数,找到第1500个,并输出来。

思路:开始使用优先队列做,用数组标记,但是数组存不下,而后想到用set容器做,不用标记,最后我用了两种方法,队列用map进行标记,过了;

方法:我们都知道合数可以表示成素数连乘的形式, 1单独处理,那么我们就可以用2,3,5,相互连乘构造题目所要求的丑数,但是这些丑数不能漏掉,也必须从小到大排列好,因此我们就可以想到优先队列和set容器。而使用函数或者容器时,不能当容器里面含有1500就停止输出,例如 5^4>2^5,但是我们会先碰到5^4的,这样就是可能会漏掉一些数据,结果是错误的。

优先队列加map

#include <stdio.h>#include <string.h>#include <algorithm>#include <queue>#include <map>typedef long long LL;using namespace std;map<LL ,int>M;int main(){    priority_queue<LL, vector<LL>, greater<LL> >Q;//从小到大排列     //priority_queue<LL>Q; //从大到小排序,    Q.push(1);    M[1]=1;    int cont=0;    LL term;    while(cont<1500)    {        term=Q.top();        Q.pop();        cont++;        if(M[term*2]==0)        {            M[term*2]=1;            Q.push(term*2);        }        if(M[term*3]==0)        {            M[term*3]=1;            Q.push(term*3);        }        if(M[term*5]==0)        {            Q.push(term*5);            M[term*5]=1;        }    }    printf("The 1500'th ugly number is %lld.\n",term);    return 0;}

set容器

#include <stdio.h>#include <string.h>#include <algorithm>#include <set>using namespace std;int main(int argc,char* argv[]){    set<long long int>S;    S.insert(1);    int t=1;    set<long long int>::iterator it;    it=S.begin();    while(t<1500)    {      S.insert(*it*2);      S.insert(*it*3);      S.insert(*it*5);      it++;      t++;    }     printf("The 1500'th ugly number is %llu.\n", *it);    return 0;}


原创粉丝点击