/* 问题描述:用自然数1到20构成一个素数环,环中的每个元素与其相邻元素的和都构成素数。请编程实现并输出这个环
*/
这里采用了递归策略,可以输出所有情况,不过存在重复输出问题,重复输出数为N,(环是没有次序的)现在没有想到好的解决方法。若自然数个数确定为20;则构环的数目相当大,程序运行时间也高得惊人。测试时可以减少自然数。代码如下:
版本:1.0
- #include<iostream>
- #include<math.h>
- using namespace std;
- #define N 20
- bool Selected[N+1];//记录自然数是否已加入到此环中
- int Ring[N]={0};//环
- bool Prime[40];//素数标记数组(自然数1-40间哪些些是素数)
- long int count=0;//总的素数环构数
- int main(){
- void Init();
- void RingS(int n);
- Init();
- RingS(0);
- cout<<endl<<endl<<"-------总的构环数为!-------"<<count/N<<endl;
- return 0;
- }
- void Init(){
- bool temp;
- for(int i=2;i<=39;i++){
- temp=true;
- for(int j=2;j<=sqrt(i);j++)if(i%j==0){temp=false;break;}
- Prime[i]=temp;//标记素数
- }
- for(i=0;i<N;i++)
- Selected[i+1]=false;
- }//初始化数字
- void RingS(int n){
- if(n==N){//形成环
- if(Prime[Ring[0]+Ring[N-1]]){//成立
- for(int k=0;k<N;k++)cout<<Ring[k]<<" ";
- cout<<endl;
- count++;
- }
- else return ;
- }
- else{
- for(int i=1;i<=N;i++){
- if(!Selected[i]){//这个数尚未被加入当前环中
- if(n>=1 && n<N){//非环中第一个数
- if(Prime[Ring[n-1]+i]){
- Selected[i]=true;
- Ring[n]=i;//加入此环
- RingS(n+1);
- Selected[i]=false;
- }
- }
- else if(n==0){//环中第一个数
- Selected[i]=true;
- Ring[n]=i;
- RingS(n+1);
- Selected[i]=false;
- }
- }
- }//end_for
- }//end_else
- }