1、简单描述
素数环,第一个位置为1,前后两个数相加和为素数。
2、思路
#include<iostream>
#include<string.h>
#include<cmath>
using namespace std;
int n,a[21];
bool vis[21]={0};
int prime[12]={2,3,5,7,11,13,17,19,23,29,31,37};//1~20任意两个数相加和为素数的所有素数和
bool isprime(int x,int y)
{
int a=x+y;
for(int i=0;i<12;i++)
if(a==prime[i]) return true;
return false;
} //
void print()
{
for(int j=1;j<n;j++)
cout<<a[j]<<" ";
cout<<a[n]<<endl;
} //输出素数环
int search(int t)
{
int i;
for(i=2;i<=n;i++)
if(isprime(a[t-1],i)&&(!vis[i]))
{
a[t]=i; //将数字i放在t位置上
vis[i]=1;
if(t==n)
{
if(isprime(a[t],a[1]))
print();
}
else search(t+1);
vis[i]=0;
}
}
int main()
{
int l=0;
while(cin>>n)
{
cout<<"Case "<<++l<<":"<<endl;
memset(vis,0,sizeof(vis));
a[1]=1;
if(n==1)
cout<<"1"<<endl<<endl;
else
{
search(2);
cout<<endl;
} //从第二个位置开始查找符合条件的数
}
return 0;
}
用普通的函数判断是否为素数会超时,感觉数据量不大呀。