问题描述
素数环是一个计算机程序问题,指的是将从1到n这n个整数围成一个圆环,若其中任意2个相邻的数字相加,结果均为素数,那么这个环就成为素数环。
现在要求输入一个n,求n个数围成一圈有多少种素数环,规定第一个数字是1。
//
// Created by admin on 2020/11/30.
//
#include "iostream"
#include "cstring"
#include "cmath"
using namespace std;
bool isprime(int x)
{
int i,n;
n=(int)sqrt(x);
for(i=2;i<=n;i++){
if(x%i==0)
return false;
}
return true;
}
bool check(int *a,int k,int n)
{
int flag=0;
for(int i=0;i<k;i++) {
if (a[k] == a[i])
return false;
}
flag=isprime(a[k]+a[k-1]);
if(flag==1 && k==n-1){
flag=isprime(a[k]+a[0]);
}
return flag;
}
void prime_add(int n)
{
int a[20]={0};
a[0]=1;
int k=1;
//属于循环用来当过滤条件用,退出的话在循环里面退出
while(k>=1){
a[k]=a[k]+1;
//第一个条件,a[k]<n
while(a[k]<=n){
if(check(a,k,n)==1){
break;
}
else{
a[k]=a[k]+1;
}
}
if(a[k]<=n && k==n-1){
for(int i=0;i<n;i++){
cout<<a[i]<<" ";
}
return ;//这里的return是意在退出prime 函数
}
//第二个条件,k<n-1,k就相当于当前状态指针
if(a[k]<=n && k<n-1){
k=k+1;
}
//先prune off 至原来的状态,然后k 回溯倒退
else{
a[k--]=0;
}
}
}
int main()
{
prime_add(6);
return 0;
}
结果
如果有解就输出,没解不输出