1 条题解

  • 0
    @ 2023-6-11 12:16:45

    C++ :

    #include<iostream>
    #include<cmath>
    using namespace std;
    int n;
    int a[21];//用于存放素数环数字
    bool b[21];//用其下标代表素数环中的数字,其存放内容代表改数字是否可用
    int total=0;//代表素数环个数
    
    bool pd(int x,int y);//判断x+y是否为素数
    void search(int t);//第归判断1-n是否满足条件
    void print();//打印满足条件的素数环
    
    int main(){
        cin>>n;
    	for(int i=1;i<=n;i++)
    		b[i]=true;
    		
    	//a[0]=1;//保证a[1]的第一位可以放1 
    
    	//从1开始搜索
    	search(1);
    
    	//打印出素数环个数
    	cout<<"total:"<<total; 
    	
    }
    
    //第归判断1-n是否满足条件
    //这里的t代表素数环中第几个
    void search(int t){
    	
    	//遍历1-n个数字
    	for(int i=1;i<=n;i++){
    		//如果第i个数字与他上一个数字(放入环中的数字)相加是素数i+a[t-1]
    		//并且该数字没有使用过b[i]=true 
    		if(pd(a[t-1],i) && b[i]==true){
    			a[t]=i;//存放进素数环
    			b[i]=false;//标记该数已经被使用过了
    			//n个数全部遍历结算
    			if(t==n &&pd(a[1],a[n])){
    				//判断头尾相加是否是素数
    				//打印素数环
    				print();
    			}	
    			search(t+1);//查找下一个
    			b[i]=true;//不满足条件的情况下把这个i给放出来
    		}
    	} 
    	
    }
    
    //判断x+y是否为素数
    bool pd(int x,int y){
    	int n;
    	bool f;
    	
    	if(x==0){
    		return true;
    	}
    	
    	//假设是素数
    	f=true;
    	n=x+y;
    	
    	for(int i=2;i<=sqrt(n);i++){
    		if(n%i==0){
    			f=false;//不是素数
    			break;//跳出循环
    		}
    	}
    	
    	//0,1 不是素数,2是素数
    	if(f==false || n==0 || n==1){
    		return false;
    	}
    	else
    	{
    		return true;
    	}
    }
    
    //打印满足条件的素数环
    void print(){
    	total=total+1;//素数环个数加1
    	cout<<total<<":";
    	for(int i=1;i<=n;i++){
    		cout<<a[i]<<" ";
    	}
    	cout<<endl;
    }
    
    
    • 1

    信息

    ID
    2278
    时间
    1000ms
    内存
    128MiB
    难度
    (无)
    标签
    递交数
    0
    已通过
    0
    上传者