Description
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.
Inputn (0 < n < 20).
Note: the number of first circle should always be 1.
OutputThe output format is shown as sample below. Each row represents a series of circle numbers in the ring beginning from 1 clockwisely and anticlockwisely. The order of numbers must satisfy the above requirements. Print solutions in lexicographical order.
You are to write a program that completes above process.
Print a blank line after each case.
Sample Input
6 8Sample Output
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,用1到n共n个数(每个数字只能使用一次)构成一个环,使环中相邻两个数的和皆为素数,第一个数字为1
思路:
最简单的想法是先列出所有的排列方式,然后判断每个相邻数字之和是否为素数,若均为素数则输存出(这个想法时间复杂度太高,会超时)
改进方案:
1:判断素数的方法
for循环判断每一个数是否为素数 -> 打表判断 n < 20,所以相邻两个数的和最大为20 + 19 = 39,出现的素数只可能是2,3,5,7,11,13,17,19,23,27,29,31,37可以开一个长度为38的数组,1代表为素数,0表示不是素数
2:可能成立的条件的判断
1)若n为奇数,则奇数个数比偶数多1,肯定会有两个奇数相邻,而奇数之和为偶数,不可能是素数,即n为奇数时直接跳出
2)奇数+奇数=偶数,偶数+偶数=偶数,而偶数不可能为素数,因此相邻两个数字的奇偶性必定不同
AC代码
#include<stdio.h>
//列举小于37的所有素数(是素数为1,不是素数为0)
int prime[38] = {0, 0, 1, 1, 0, 1, 0,1, 0, 0, 0, 1, 0, 1,0, 0, 0, 1, 0, 1, 0,0, 0, 1, 0, 0, 0, 0,0, 1, 0, 1, 0, 0, 0,0, 0, 1};
void output(int a[],int n){
for(int i = 0;i < n;i++){
if(i == n - 1)
printf("%d",a[i]);
else
printf("%d ",a[i]);
}
printf("\n");
}
bool IsPrime(int a[],int last,int cur){
//相邻元素和为素数
if(prime[a[last] + cur] == 1)
return true;
//去重,cur没出现过
for(int i = 0;i <= last;i++)
if(a[i] == cur)
return false;
return true;
}
void PrimeCircle(int a[],int n,int t){
//奇数无解
if(n & 1)
return ;
if(t == n){
//判断首尾元素之和是否构成素数
if(prime[a[0]+a[n-1]] == 1)
output(a,n);
}
else{
for(int i = 2;i <= n;i++){
a[t] = i;
//如果当前元素满足条件
if(IsPrime(a,t-1,i))
//进行下一次递归
PrimeCircle(a,n,t+1);
}
}
}
int main(){
int a[20],n,k = 1;
a[0] = 1;
while(scanf("%d",&n)!=EOF){
printf("Case %d:\n",k++);
PrimeCircle(a,n,1);
printf("\n");
}
return 0;
}