找素数(一些数任意组合,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 }