zcmu-1178: 完美的数(乘数累加)

版权声明:本人大三在读,有错误烦请指正,共同进步- ( ゜- ゜)つロ 乾杯~点赞请按右上角,转载请标明出处: https://blog.csdn.net/hzyhfxt/article/details/84288286

感谢博客链接 

1178: 完美的数

Time Limit: 1 Sec  Memory Limit: 128 MB
Submit: 128  Solved: 82
[Submit][Status][Web Board]

Description

一个数是否完美是这样定义的,如果这个数的素数因子只有2,3,5,7,那么这个数就是完美的.

显而易见前面几个完美的数为1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 12, 14, 15, 16, 18, 20, 21, 24, 25, 27, ... 

你能告诉我第n个完美的数是多少嘛?

Input

多组测试数据.每组数据的第一行包含一个正整数n(1<= n<=5842).

Output

对于每组测试数据输出第n个完美的数

Sample Input

1 11 5842

Sample Output

1 12 2000000000

题目可以化简成:只用到2357这些素数相乘能组成哪些数,理解这句话就可以看下面的代码了

【通过代码】 

#include <cstdio>
#include <cstdlib>
#include <cstring>
#include <cmath>
#include <cstdlib>
#include <vector>
#include <set>
#include <queue>
#include <algorithm>
#include <iostream>
using namespace std;

typedef long long ll;
int num[4] = {2,3,5,7};
set<ll> s;
priority_queue<ll,vector<ll>,greater<ll> > q;
vector<ll> v;
void init()
{
    s.insert(1);
    q.push(1);
    
    for(int j = 1; j <= 5842;j++)
    {
        ll a = q.top();//取出当前最小的数 分别和2357相乘
        q.pop();//当前使用这个数,所以从队列中删掉
        v.push_back(a);//这个数是能够达到的,存到数组中去
        for(int i = 0; i < 4;i++)
        {
            ll b = a * num[i];
            if(!s.count(b))//set中没出现过的话---1
            {
                s.insert(b);
                q.push(b);//添加到队列尾---2
            }
        }
    }
}
int main()
{
    init();
    int n;
    while(scanf("%d",&n) != EOF)
    {
        printf("%lld\n",v[n-1]);
    }
    return 0;
}

 【运行部分过程】

队首元素: 1
2 = 1 * 2 
3 = 1 * 3 
5 = 1 * 5 
7 = 1 * 7 
队首元素: 2
4 = 2 * 2 
6 = 2 * 3 
10 = 2 * 5 
14 = 2 * 7 
队首元素: 3
6 = 3 * 2 
9 = 3 * 3 
15 = 3 * 5 
21 = 3 * 7 
队首元素: 4
8 = 4 * 2 
12 = 4 * 3 
20 = 4 * 5 
28 = 4 * 7 
队首元素: 5
10 = 5 * 2 
15 = 5 * 3 
25 = 5 * 5 
35 = 5 * 7 
队首元素: 6
12 = 6 * 2 
18 = 6 * 3 
30 = 6 * 5 
42 = 6 * 7 
队首元素: 7
14 = 7 * 2 
21 = 7 * 3 
35 = 7 * 5 
49 = 7 * 7 
队首元素: 8
16 = 8 * 2 
24 = 8 * 3 
40 = 8 * 5 
56 = 8 * 7 
队首元素: 9
18 = 9 * 2 
27 = 9 * 3 
45 = 9 * 5 
63 = 9 * 7 
队首元素: 10
20 = 10 * 2 
30 = 10 * 3 
50 = 10 * 5 
70 = 10 * 7 
队首元素: 12
24 = 12 * 2 
36 = 12 * 3 
60 = 12 * 5 
84 = 12 * 7 
队首元素: 14
28 = 14 * 2 
42 = 14 * 3 
70 = 14 * 5 
98 = 14 * 7 
队首元素: 15
30 = 15 * 2 
45 = 15 * 3 
75 = 15 * 5 
105 = 15 * 7 
队首元素: 16
32 = 16 * 2 
48 = 16 * 3 
80 = 16 * 5 
112 = 16 * 7 
队首元素: 18
36 = 18 * 2 
54 = 18 * 3 
90 = 18 * 5 
126 = 18 * 7 
队首元素: 20
40 = 20 * 2 
60 = 20 * 3 
100 = 20 * 5 
140 = 20 * 7 
队首元素: 21
42 = 21 * 2 
63 = 21 * 3 
105 = 21 * 5 
147 = 21 * 7 

猜你喜欢

转载自blog.csdn.net/hzyhfxt/article/details/84288286