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
素数环,要注意第一个和最后一个也要为素数,因为n为20以内的数,所以可以直接打表写出40以内的所有素数,开头是1,然后就分别判断相邻两个数和是否为素数,并且是否都没用过即可。
#include<cstdio> #include<iostream> #include<algorithm> #include<cmath> #include<string.h> using namespace std; int sushu[13]={2,3,5,7,11,13,17,19,23,29,31,37}; int n; int a[22]; int b[22]; int su(int x,int y) { int sum=x+y; for(int i=0;i<12;i++) { if(sum==sushu[i]) return 1; } return 0; } void dg(int m,int s,int a[]) { a[s]=m; if(s==n&&su(a[1],a[n])) { for(int i=1;i<n;i++) printf("%d ",a[i]); printf("%d\n",a[n]); return; } for(int i=1;i<=n;i++) { int flag=0; for(int j=1;j<=s;j++) { if(i==a[j])flag=1; } if(!flag&&su(m,i)) { dg(i,s+1,a); } } return; } int main() { int k=1; while(~scanf("%d",&n)) { printf("Case %d:\n",k++); int s=1; memset(a,0,sizeof(a)); dg(1,s,a); printf("\n"); } return 0; } //2 3 5 7 11 13 17 19 23 29 31 37 41