#include<stdio.h>
using namespace std;
typedef long long ll;
int coeff[3]={2,3,5};
int main()
{
//freopen("shuju.txt","r",stdin);
priority_queue< ll,vector<ll>,greater<ll> > q;
set<ll> s;
q.push(1);s.insert(1);
for(int i=1;;++i)
{
ll x=q.top();q.pop();
if(i==1500)
{
printf("The 1500'th ugly number is %lld.\n",x);
break;
}
for(int j=0;j<3;++j)//每次生成三个数
{
ll y=x*coeff[j];
if(!s.count(y))//防止重复
{
s.insert(y);
q.push(y);
}
}
}
return 0;
}
简单题也有简单的做法。耗时短
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
int d[ 1505 ];
int main()
{
int p2 = 1,p3 = 1,p5 = 1,save = 2;
d[1] = 1;
while ( save <= 1500 ) {
if ( d[p2]*2 <= d[p3]*3 && d[p2]*2 <= d[p5]*5 ) {
if ( d[save-1] < d[p2]*2 )
d[save ++] = d[p2++]*2;
else p2 ++;
}else if ( d[p3]*3 <= d[p2]*2 && d[p3]*3 <= d[p5]*5 ) {
if ( d[save-1] < d[p3]*3 )
d[save ++] = d[p3++]*3;
else p3 ++;
}else if ( d[p5]*5 <= d[p2]*2 && d[p5]*5 <= d[p3]*3 ) {
if ( d[save-1] < d[p5]*5 )
d[save ++] = d[p5++]*5;
else p5 ++;
}
}
printf("The 1500'th ugly number is %d.\n",d[1500]);
return 0;
}