找素数(一些数任意组合,DFS)

素数又称质数,是指一个大于 1 的正整数,如果除了 1 和它本身以外,不能再被其它的数整除, 例如:2、3、5、97 等都是素数。2 是最小的素数。
现在,给你 n 个数字,请你从中选取一部分,用它们拼出一个最大的素数。
注意:某个数字出现多少次你就可以用多少次,6 与 9 不能混用。

样例 输入   3 2 7 9

样例输出    97


 1 #include<bits/stdc++.h>
 2 using namespace std;
 3 const int N = 100000 + 5;
 4 int vis[50];
 5 bool prime[N];//prime[i]表示i是不是质数
 6 int p[N], tot;//p[N]用来存质数
 7 int n,a[10];
 8  
 9 void init(){
10     for(int i = 2; i < N; i ++) prime[i] = true;//初始化为质数
11     for(int i = 2; i < N; i++){
12         if(prime[i]) p[tot ++] = i;//把质数存起来
13         for(int j = 0; j < tot && i * p[j] < N; j++){
14             prime[i * p[j]] = false;
15             if(i % p[j] == 0) break;//保证每个合数被它最小的质因数筛去
16         }
17     }
18 }
19 int ans;
20 void dfs(int m,int num)
21 {
22     if (prime[num])
23     {
24         ans=max(ans,num);
25     }
26     if (m>=n)
27     {
28         return ;
29     }
30     for (int i=1;i<=n;i++)
31     {
32         if (!vis[i])
33         {
34             vis[i]=true;
35             dfs(m+1,num*10+a[i]);
36             vis[i]=false;
37         }
38     }
39 }
40  
41 int main()
42 {
43    init();
44    scanf("%d",&n);
45    for(int i=1;i<=n;i++)
46    {
47        scanf("%d",&a[i]);
48    }
49    dfs(0,0); //从0开始,使每一个数都有成为个位数的可能
50    if(ans) printf("%d",ans);
51    else printf("-1\n");
52    return 0;
53 }

 

 
posted @ 2020-02-01 08:59  sylvia11  阅读(416)  评论(0编辑  收藏  举报