- 题目说一个数的质因数只包含2、3或者5(一个或多个),就是丑陋数。拜托,为啥这些数就丑陋了。然后题目特别说明第一个丑陋数是1
- 题目多组数据输入到0为止,然后输出第n个丑陋数。
- 解题思路就是对于一个丑陋数k,那么一定有2*k、3*k和5*k也是丑陋数,所以按照这个思路入队模拟打表即可
- 值得注意的是,对于2*k1来说可能和 3*k2重复,例如2*12 = 3*8;所以在入队的时候不能让重复元素入队。
- 代码:
![]()
1 #include <iostream>
2 #include <string>
3 #include <cstdio>
4 #include <cstdlib>
5 #include <sstream>
6 #include <iomanip>
7 #include <map>
8 #include <stack>
9 #include <deque>
10 #include <queue>
11 #include <vector>
12 #include <set>
13 #include <list>
14 #include <cstring>
15 #include <cctype>
16 #include <algorithm>
17 #include <iterator>
18 #include <cmath>
19 #include <bitset>
20 #include <ctime>
21 #include <fstream>
22 #include <limits.h>
23 #include <numeric>
24
25 using namespace std;
26
27 #define F first
28 #define S second
29 #define mian main
30 #define ture true
31
32 #define MAXN 1000000+5
33 #define MOD 1000000007
34 #define PI (acos(-1.0))
35 #define EPS 1e-6
36 #define MMT(s) memset(s, 0, sizeof s)
37 typedef unsigned long long ull;
38 typedef long long ll;
39 typedef double db;
40 typedef long double ldb;
41 typedef stringstream sstm;
42 const int INF = 0x3f3f3f3f;
43
44 priority_queue<ll,vector<ll>,greater<ll> >q;
45 vector<ll>p(1501);
46
47 void init(){
48 q.push(1);
49 int num = 1;
50 for(int i = 1; i <= 1501; i++){
51 ll sum = q.top();
52 q.pop();
53 p[num++] = sum;
54 ll a = sum*2, b = sum*3, c = sum*5;
55 if((a % 5) && (a % 3))
56 q.push(a);
57 if(b % 5)
58 q.push(b);
59 q.push(c);
60 }
61 }
62
63 int main(){
64 ios_base::sync_with_stdio(false);
65 cout.tie(0);
66 cin.tie(0);
67 int n;
68 init();
69 while(cin>>n && n){
70 cout << p[n] << endl;
71 }
72
73 return 0;
74 }
View Code