丑数 UVA 136

丑数是指不能被除了2,3,5以外的其他素数整数的数,把丑数从小到大排列起来,结果如下: 

1,2,3,4,5,6,8,9,10,12,15...

我们要求第1500个丑数。

思考:我们可以要从小到大生成各个丑数,那么怎么生成。

这里用到set容器和queue 优先队列

set容器用于去重

queue用于存放丑数

对于一个丑数x,2x,3x,5x,也是丑数,这样可以用一个优先队列保存已生成的丑数,每次取出最小丑数,生成3个丑数。

#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#include<string>
#include<queue>
#include<set>
#include<vector>
#include<math.h>
using namespace std;
typedef long long LL;
const int coeff[3]={2,3,5};
int main(){
    LL a,b;
    priority_queue<LL,vector<LL>,greater<LL> > p;
    set<LL> s;
    s.insert(1);
    p.push(1);
  for(int j=1;;j++)  {
        a=p.top();
        p.pop();
        if(j==1500){
            printf("The 1500'th ugly number is %d.\n",a);
            break;
        }
       for(int i=0;i<3;i++){
        b=a*coeff[i];
        if(!s.count(b)){
            s.insert(b);
            p.push(b);
        }
       }



    }

  return 0;
}

 

posted @ 2015-12-17 19:56  咸咸的告别  阅读(211)  评论(0编辑  收藏  举报