素數環問題
素數環是一個計算機程序問題,指的是將從1到n這n個整數圍成一個圓環,若其中任意2個相鄰的數字相加,結果均爲素數,那麼這個環就成爲素數環。
現在要求輸入一個n,求n個數圍成一圈有多少種素數環,規定第一個數字是1。
樣例輸入
6
1 4 3 2 5 6
1 6 5 2 3 4
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已經確定,所以從第二個數字開始
要求找出所有的情況
利用全排列思想或者每個位置進行假定(此處是根據每個位置進行),找出所有可能的排列並對其進行判斷
相鄰的兩個數相加爲素數,因要求找出素數環所以還需要進行首位的相應判斷
#include<stdio.h>
#include <math.h>
int a[100];
int b[100];//當前數字是否被用過
int n;
bool perm(int m){
for(int s=2;s<=sqrt(m);s++){
if(m%s==0){
return false;
}
}
return true;
}
void dfs(int t){
int i;
if(t==n && perm(a[0]+a[n-1]) && a[n-1]!=0){
for(i=0;i<n;i++)
printf("%3d",a[i]);
printf("\n");
return;
}
else for(i=2;i<=n;i++){
if(b[i-1]==0)
{
a[t]=i;
b[i-1]=1;
if(perm(a[t]+a[t-1]))
dfs(t+1);
b[i-1]=0;
}
}
}
int main(){
int i;
scanf("%d",&n);
if(n%2==1){
printf("no anther\n");
return 0;
}
for(i=0;i<n;i++){
a[i]=0;
b[i]=0;
}
a[0]=1;
b[0]=1;
dfs(1);
return 0;
}