题目描述
一个自然数是素数,且它的数字位置经过任意对换后仍为素数,则称为绝对素数,例如13。请找出所有x位的绝对素数的数量。
输入描述
输入正整数x
输出描述
x位的绝对素数的数量
样例输入
1
样例输出
4
数据范围及提示
x(x<=6)
分析
这道题首先用深搜找出x个数,然后用全排列找绝对素数
#include<iostream>
#include<algorithm>
#include<cstring>
using namespace std;
#define N 10
int n,ans;
int a[N],b[N];
bool check(int x)//判断是否为素数
{
if(x == 0 || x == 1) return false;
for(int i = 2; i * i <= x; i++)
if(x % i == 0) return false;
return true;
}
void dfs(int m,int st)
{
if(m == n) {
memcpy(b,a,sizeof(a));
int sum,tmp = 0;
do {
sum = 0;
for(int i = 0; i < n; i++)
sum = sum * 10 + b[i];
if(!check(sum)) return;//如果不是素数,直接返回,ans不需要加上tmp
tmp++;
} while(next_permutation(b,b + n));
//在做全排列之前需要先排序,找下一个排列的方式不会有重复字符问题
ans += tmp;
return;
}
for(int i = st; i < 10; i++) {
a[m] = i;
dfs(m + 1,i);//这里可以巧妙的排序
}
}
int main()
{
cin >> n;
dfs(0,1);//起点不用从0开始,因为以0结尾的数不是素数
cout << ans << endl;
return 0;
}