素数环问题

/* 问题描述:用自然数1到20构成一个素数环,环中的每个元素与其相邻元素的和都构成素数。请编程实现并输出这个环

*/ 

这里采用了递归策略,可以输出所有情况,不过存在重复输出问题,重复输出数为N,(环是没有次序的)现在没有想到好的解决方法。若自然数个数确定为20;则构环的数目相当大,程序运行时间也高得惊人。测试时可以减少自然数。代码如下:

版本:1.0

  1. #include<iostream>
  2. #include<math.h>
  3. using namespace std;
  4. #define N 20
  5. bool Selected[N+1];//记录自然数是否已加入到此环中
  6. int Ring[N]={0};//环
  7. bool Prime[40];//素数标记数组(自然数1-40间哪些些是素数)
  8. long int count=0;//总的素数环构数
  9. int main(){
  10.  void Init();
  11.  void RingS(int n);
  12.  Init();
  13.  RingS(0);
  14.  cout<<endl<<endl<<"-------总的构环数为!-------"<<count/N<<endl;
  15.  return 0;
  16. }
  17. void Init(){
  18.  bool temp;
  19.  for(int i=2;i<=39;i++){
  20.   temp=true;
  21.   for(int j=2;j<=sqrt(i);j++)if(i%j==0){temp=false;break;}
  22.   Prime[i]=temp;//标记素数
  23.  }
  24.  for(i=0;i<N;i++)
  25.   Selected[i+1]=false;
  26. }//初始化数字
  27. void RingS(int n){
  28.     if(n==N){//形成环
  29.    if(Prime[Ring[0]+Ring[N-1]]){//成立
  30.     for(int k=0;k<N;k++)cout<<Ring[k]<<" ";
  31.     cout<<endl;
  32.     count++;
  33.    }
  34.    else return ;
  35.   }
  36.   else{
  37.    for(int i=1;i<=N;i++){
  38.     if(!Selected[i]){//这个数尚未被加入当前环中
  39.      if(n>=1 && n<N){//非环中第一个数
  40.       if(Prime[Ring[n-1]+i]){
  41.        Selected[i]=true;
  42.        Ring[n]=i;//加入此环
  43.        RingS(n+1);
  44.        Selected[i]=false;
  45.       }
  46.      }
  47.                     else if(n==0){//环中第一个数
  48.       Selected[i]=true;
  49.       Ring[n]=i;
  50.       RingS(n+1);
  51.       Selected[i]=false;
  52.      }
  53.     }
  54.    }//end_for 
  55.   }//end_else
  56. }

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值