素数环
时间限制:
1000 ms | 内存限制:
65535 KB
难度:
2
-
描述
-
有一个整数n,把从1到n的数字无重复的排列成环,且使每相邻两个数(包括首尾)的和都为素数,称为素数环。
为了简便起见,我们规定每个素数环都从1开始。例如,下图就是6的一个素数环。
输入
如果存在满足题意叙述的素数环,从小到大输出。
否则输出No Answer。
6 8 3 0
Case 1: 1 4 3 2 5 6 1 6 5 2 3 4 Case 2: 1 2 3 8 5 6 7 4 1 2 5 8 3 4 7 6 1 4 7 6 5 8 3 2 1 6 7 4 3 8 5 2 Case 3: No Answer
#include<string.h>
#include<stdio.h>
#include<math.h>
using namespace std;
int a[50];//做标记
int b[50];//保存选择的数
int n;
int prime(int x){
int i;
for(i=2;i<=sqrt(x);i++)
if(x%i==0) return 0;
return 1;
}
void dfs(int k){
if(k==(n+1)&&prime(b[n]+b[1])){
for(int i=1;i<n;i++)
printf("%d ",b[i]);
printf("%d\n",b[n]);
return;
}
for(int i=2;i<=n;i++){//用i作自然数
if(a[i]&&prime(b[k-1]+i)){
a[i]=0;
b[k]=i;
dfs(k+1);
a[i]=1;
}
}
}
int main()
{
int ans=0;
memset(a,1,sizeof(a));
memset(b,0,sizeof(b));
b[1]=1;
while(~scanf("%d",&n)&&n){
ans++;
printf("Case %d:\n",ans);
if(n==1||n%2==0)
dfs(2);
else printf("No Answer\n");
}
return 0;
}