版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/qq_37868325/article/details/88233633
题意:
Ugly numbers are numbers whose only prime factors are 2, 3 or 5. The sequence
1, 2, 3, 4, 5, 6, 8, 9, 10, 12, ...
shows the first 10 ugly numbers. By convention, 1 is included.
Given the integer n,write a program to find and print the n'th ugly number.
Input
Each line of the input contains a postisive integer n (n <= 1500).Input is terminated by a line with n=0.
Output
For each line, output the n’th ugly number .:Don’t deal with the line with n=0.
Sample Input
1
2
9
0
Sample Output
1
2
10
思路:类似晒素数,放了两种做法
代码:(AC)
#include<iostream>
#include<cstdio>
#include<set>
using namespace std;
#define mod 100007
set<long long>s;
set<long long>::iterator it;
long long a[1510],b[1510],x,y,z;
int cnt;
int main()
{
b[1]=1;
x=y=z=1;
for(int i=2;i<=1500;i++)
{
b[i]=min(min(b[x]*2,b[y]*3),b[z]*5);
if(b[i]==b[x]*2) x++;
if(b[i]==b[y]*3) y++;
if(b[i]==b[z]*5) z++;
}
int n;
s.insert(1);
cnt=0;
while(!s.empty())
{
it=s.begin();
a[++cnt]=*it;//cout<<cnt<<" "<<a[cnt]<<" "<<y<<endl;
s.erase(s.begin());
if(cnt==1500) break;
x=a[cnt];
y=x*2;
s.insert(y);
y=x*3;
s.insert(y);
y=x*5;
s.insert(y);
}
while(~scanf("%d",&n)
{printf("%d\n",b[n]);
}
}