A ring is compose of n circles as shown in diagram. Put natural number 1, 2, ..., n into each circle separately, and the sum of numbers in two adjacent circles should be a prime.
Note: the number of first circle should always be 1.
Note: the number of first circle should always be 1.
You are to write a program that completes above process.
Print a blank line after each case.
6 8
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
题意:按字典序输出素数环,素数环就是两两相邻的两个数相加 和为素数
#include<cstdio> #include<cmath> #include<cstring> int vis[20]; int num[20]; int n; int sushu(int x)//判断是否为素数 { int i,k=sqrt(x); for(i=2;i<=k;i++) { if(x%i==0) break; } if(i>k&&x!=1)//1不是素数 return 1; return 0; } void dfs(int index) { if(index==n) { if(sushu(num[index]+num[1]))//输出答案 { for(int i=1;i<n;i++) printf("%d ",num[i]); printf("%d\n",num[n]); } } for(int i=2;i<=n;i++) { if(!vis[i]&&sushu(num[index]+i)) { vis[i]=1; num[index+1]=i;//注意这里自加用index+1; dfs(index+1); vis[i]=0;//回溯回去的时候把标记清除掉 } } } int main() { int Case=1; while(~scanf("%d",&n)) { memset(vis,0,sizeof(vis)); printf("Case %d:\n",Case++); if(n%2&&n!=1)//n为奇数是不可能存在素数环的,所以可以直接跳过,加速; { printf("\n"); continue; } num[1]=1; dfs(1); printf("\n"); } return 0; }