素数环

    xiaoxiao2025-08-28  21

    

    素数环

    时间限制: 1000 ms  |  内存限制: 65535 KB 难度: 2 描述

    有一个整数n,把从1到n的数字无重复的排列成环,且使每相邻两个数(包括首尾)的和都为素数,称为素数环。

    为了简便起见,我们规定每个素数环都从1开始。例如,下图就是6的一个素数环。

    输入 有多组测试数据,每组输入一个n(0<n<20),n=0表示输入结束。 输出 每组第一行输出对应的Case序号,从1开始。 如果存在满足题意叙述的素数环,从小到大输出。 否则输出No Answer。 样例输入 6 8 3 0 样例输出 Case 1: 1 4 3 2 5 6 1 6 5 2 3 4 Case 2: 1 2 3 8 5 6 7 4 1 2 5 8 3 4 7 6 1 4 7 6 5 8 3 2 1 6 7 4 3 8 5 2 Case 3: No Answer #include<stdio.h> #include<string.h> #define maxn 1000 int a[1000]; int b[1000]; int c[1000]; void we()//筛法求素数 {     a[0]=a[1]=1;     for(int i=2; i<maxn; i++)     {         if(!a[i])         {             for(int j=2*i; j<maxn; j+=i)             {                 a[j]=1;             }         }     } } void bfs(int k,int n)//递归 {     if(k==n+1&&!a[b[1]+b[n]])     {         printf("1");         for(int i=2;i<=n;i++)         {             printf(" %d",b[i]);         }         printf("\n");         return ;     }     for(int i=2;i<=n;i++)     {         if(!a[b[k-1]+i]&&!c[i])         {             b[k]=i;             c[i]=1;             bfs(k+1,n);             c[i]=0;         }     } } int main() {     we();     int g=0;     int n;     while(scanf("%d",&n)!=-1)     {g++;         if(n==0)             break;              printf("Case %d:\n",g);             if(n==1)                 printf("1\n");             else if(n%2==1)                 printf("No Answer\n");             else             {             b[1]=1;             c[1]=1;             bfs(2,n);             }     } }
    转载请注明原文地址: https://ju.6miu.com/read-1302075.html
    最新回复(0)