素数又称质数,是指一个大于 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 }
来源:https://www.cnblogs.com/sylvia1111/p/12247533.html