【题目描述】
素数又称质数,是指一个大于 1 的正整数,如果除了 1 和它本身以外,不能再被其它的数整除,例如:2、3、5、97 等都是素数。2 是最小的素数。
现在,给你 n 个数字,请你从中选取一部分,用它们拼出一个最大的素数。注意:某个数字出现多少次你就可以用多少次,6 与 9 不能混用。
【输入数据】
输入共 2 行:
第 1 行,1 个整数 n,表示所给你的数字的个数。
第 2 行,n 个数字,用一个空格隔开,其含义如题目所述。
【输出数据】
输出共 1 行,1 个整数,为找到的最大素数。若无法拼出素数,输出-1。
【样例输入】
3
2 7 9
【样例输出】
97
【数据范围】
对于 30%的数据:n ≤ 3;
对于 60%的数据:n ≤ 4;
对于 100%的数据:n ≤ 5。
【解题思路】
分析数据范围,范围很小,可以直接求全排列,然后用最朴素的方法判断素数即可求出解。
【参考程序】
#include
#include
#include
using namespace std;
int n,a[6],ans,visit[11];
bool prime(int num)
{
if (num==1) return false;
if (num==0) return false;
for (int i=2;iif (num%i==0) return false;
return true;
}
void dfs(int len,int num)
{
if (prime(num)) ans=max(ans,num);
if (len>=n)
{
return ;
}
for (int i=1;i<=n;i++)
{
if (!visit[i])
{
visit[i]=true;
dfs(len+1,num*10+a[i]);
visit[i]=false;
}
}
}
int main()
{
//freopen("prime.in","r",stdin);
//freopen("prime.out","w",stdout);
scanf("%d",&n);
for (int i=1;i<=n;i++) scanf("%d",&a[i]);
dfs(0,0);
if (ans==0) cout<<-1;
else printf("%d",ans);
return 0;
}