素数环:从1到20这20个数摆成一个环,要求相邻的两个数的和是一个素数。输出这些素数环
分析:首先设有20个空位,填进20个数,可以填数的条件是这个数在之前没有出现过,并且与它的前一个数的和是
一个素数;注意第二十个数时还要判断与第一个数的和是否是一个素数。若满足条件,填数,否则填下一个数;
直接上代码,里面有注释的哈
#include<iostream>
#include<cmath>
using namespace std;
int search(int x); //x表示当前位数
int a[22];//当前位数的值
int ans = 0;//方法总数
int b[22] = {0};//b[i]表示i是否可用(是否已经被使用)
bool sushu(int m,int n);
int main()
{
search(1);
return 0;
}
int search(int x)
{
for(int i=1;i<=20;i++) //当前位有20中选法, 1-20个数太多了,建议改成6试试
{
if(sushu(a[x-1],i) && !b[i]) //前后两个数是素数,前当前这个数没有被使用
{
a[x] = i; //把符合条件的数填在x位,
b[i] = 1; //把这个数标记为不可用
if(x==20 && sushu(a[1],a[20]))
{
ans++;
cout<<ans<<'>';
for(int i=1;i<=20;i++)
{
cout<<a[i]<<" ";
}
cout<<endl;
}
search(x+1);
b[i] = 0;
}
}
}
bool sushu(int m,int n)
{
int k=2;
int s = m+n;
while(k<=sqrt(s)&&s%k!=0)k++;//判断s是否为素数
if(k>sqrt(s))return true;
else return false;
}