http://poj.org/problem?id=1338
Time Limit: 1000MS | Memory Limit: 10000K | |
Total Submissions: 22968 | Accepted: 10218 |
Description
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
Source
New Zealand 1990 Division I,UVA 136
丑数的定义:一个数的素因数只有2, 3,或5.
因此只有这三个数来回的做乘法,按顺序存起来就OL!
#include <cstdio> #include <cstring> #include <iostream> #include <cmath> #include<queue> #include<stack> #include<algorithm> using namespace std; const int maxn=1502; const int INF=0x3f3f3f3f; int ugly[maxn]= {0, 1}; void Init() { int num2=2, num3=3, num5=5; int i, j, k, t; i=j=k=1; for(int x=2; x<maxn; x++) { t=min(num2, min(num3, num5)); ugly[x]=t; if(t==num2) num2=ugly[++i]*2; if(t==num3) num3=ugly[++j]*3; if(t==num5) num5=ugly[++k]*5; } } int main() { Init(); int n; while(scanf("%d", &n), n) printf("%d\n", ugly[n]); return 0; }
#include<iostream> #include<cstdio> #include<cstdlib> #include<cstring> #include<math.h> #include<queue> #include<set> #include<map> #include<algorithm> typedef long long LL; using namespace std; const int maxn=10010; const int INF=0x3f3f3f3f; const int ugly[3]={2, 3, 5}; LL a[maxn]; void init() { priority_queue<LL, vector<LL>, greater<LL> >Q; set<LL> s; Q.push(1); s.insert(1); int k=1; for(int i=1; ; i++) { LL x=Q.top(); Q.pop(); a[k++]=x; if(i==1520) break; for(int j=0; j<3; j++) { LL t=x*ugly[j]; if(!s.count(t)) { s.insert(t); Q.push(t); } } } } int main() { init(); int n; while(scanf("%d", &n), n) { printf("%lld\n", a[n]); } return 0; }