• 题目说一个数的质因数只包含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

相关文章: