素数环

素数环素数环时间限制:1000 ms|内存限制:65535 KB难度:2素数环时间限制:1000 ms|内存限制:65535 KB难度:2

大家好,又见面了,我是你们的朋友全栈君。

素数环

时间限制:
1000 ms  |  内存限制:65535 KB
难度:
2
描述
  有一个整数n,把从1到n的数字无重复的排列成环,且使每相邻两个数(包括首尾)的和都为素数,称为素数环。为了简便起见,我们规定每个素数环都从1开始。例如,下图就是6的一个素数环。

<span role="heading" aria-level="2">素数环

输入
  有多组测试数据,每组输入一个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

思路:  dfs。先打表记录40以内是素数的数组prime,因为相邻数之和有可能最大为39,所以只需枚举到39。从2开始到n枚举哪些数是满足条件,有的话就将当前这个数记录
在a数组中,并且标记这个数已经被访问,再递归下去寻找下一个数,如果递归不满足条件的话,将当前这个数置为0。每当m==n+1时就输出当前素数环。如果给定的整数n为奇数,那么
肯定不存在素数环,(因为肯定存在两个奇数相邻,而奇数与奇数的和为偶数,所以一定不是素数环)这个节省了不少递归时间
 1 #include<stdio.h>
 2 #include<string.h>    //数组初始化memset()函数头文件,memset(数组名,初始值,sizeof(数组名)),C语言中#include<string.h>  
 3 int prime[40];//存放素数的数组,题目要求0<n<20,最多两数之和20+20=40,所以数组大小开到40就够了 
 4 int a[22];//储存并更新排序后的数的序列
 5 int visit[22];
 6 int m;//代表当前所判断的数是第几个数
 7 void ifprime()//打表法将1到40之间所有的素数用1标记放入数组中对应位置,其余数用0标记
 8 {
 9     for(int i=2;i<=40;i++) 
10         prime[i]=1;
11     prime[1]=0;
12     for(int i=2;i<=40;i++)
13             for(int j=2*i;j<=40;j+=i)
14                 prime[j]=0;//偶数标记0 
15 }
16 void dfs (int m,int n)
17 {
18      if(m==n+1&&prime[1+a[n]])//如果当前判断的是第n+1个数,则证明前面所有的排序均符合题意,因为是环所以要判断首尾相加是否是素数,prime[1+a[n]判断是否为素数 
19      {
20          for(int i=1;i<=n;i++)
21          printf("%d ",a[i]);
22          printf("\n");
23          return ;
24      }
25      else
26      {
27          for(int i=2;i<=n;i++)//因为题目要求从1开始输出,所以判断时从2开始回溯
28           {
29               if(!visit[i]&&prime[i+a[m-1]])//如果i没被用过且他和上一个数的和为素数,则往下执行
30               {
31                   a[m]=i;//将i储存开始判断下一个数
32                   visit[i]=1;//标记i已经用过
33                   dfs(m+1,n);//继续对下一个数进行判断
34                   visit[i]=0;//清除标志
35               }
36           }
37      }
38 }
39 int main()
40 {
41     int n,i,j,k=1;
42     ifprime();
43     while(~scanf("%d",&n)&&n)//多组数据,当输入0时结束 
44     {
45         memset(a,0,sizeof(a));
46         memset(visit,0,sizeof(visit));
47         a[1]=1;
48         visit[1]=1;
49         printf("Case %d:\n",k++);
50         if(n==1)//如果n是1则自己成环输出1
51             printf("1\n");
52         else if(n%2!=0)//如果n为奇数,直接输出No Answer
53             printf("No Answer\n");
54         else
55         dfs(2,n);//从第二个数开始向后依次判断 
56     }
57     return 0;
58 }

https://blog.csdn.net/zsd201531107026/article/details/53044349

 

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/155812.html原文链接:https://javaforall.net

(0)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • oracle数据库外包,Oracle两地三中心「建议收藏」

    oracle数据库外包,Oracle两地三中心「建议收藏」①为使云平台生产中心与市委生产中心能够互相访问同样的数据内容,采用云平台2个节点+市委2个节点共4个节点的RAC集群;②建设两地三中心(同城与异地的业务中心、容灾中心)的数据库与应用容灾的解决方案,需要搭建一套4节点(云平台2个节点+市委2个节点)RAC+云平台2个节点RAC的容灾数据库;③为了让容灾数据库服务器能快速与容灾应用服务器接管业务需要搭建一套RAC+RAC的容灾数据库。此数据库使…

    2022年6月15日
    19
  • java面试题csdn_java底层面试题

    java面试题csdn_java底层面试题问题是:n只奶牛坐在一排,每个奶牛拥有ai个苹果,现在你要在它们之间转移苹果,使得最后所有奶牛拥有的苹果数都相同,每一次,你只能从一只奶牛身上拿走恰好两个苹果到另一个奶牛上,问最少需要移动多少次可以平分苹果,如果方案不存在输出-1输出描述:输出一行表示最少需要移动多少次可以平分苹果,如果方案不存在则输出-1。输入例子:471595输出例子:3im…

    2022年8月31日
    3
  • idea2021 激活码 csdn【永久激活】

    (idea2021 激活码 csdn)2021最新分享一个能用的的激活码出来,希望能帮到需要激活的朋友。目前这个是能用的,但是用的人多了之后也会失效,会不定时更新的,大家持续关注此网站~https://javaforall.net/100143.htmlIntelliJ2021最新激活注册码,破解教程可免费永久激活,亲测有效,上面是详细链接哦~ML…

    2022年3月20日
    667
  • 设计手机APP界面的感想

    设计手机APP界面的感想设计手机APP界面的感想设计三个界面,花费了大概七八个小时。看老师讲解的时候,感觉就是那么回事,挺简单的,其实不然,当亲自操作后发现了诸多问题。首先是对已知工具运用上的不熟练,有些昨天刚刚使用过的工具,在今天的设计中就发生了一些错误,导致返工修改的时候浪费了好多时间。还有就是不能很好地将几个软件的功能结合起来,不如最近学了PS和UI,在今天的设计中主要使用的是UI,在设计过程中发现界面的一些板

    2022年6月21日
    25
  • 【kali】kali设置burpsuite抓包dvwa

    【kali】kali设置burpsuite抓包dvwakali自带burpsuite配置代理burpsuite是通过代理来抓包dvwa的burpsuite:proxy—>options里边监听的应该是127.0.0.1:8080(端口ip如果撞车了都可以自己改)火狐:preferences–>最下边的networksettings点击settings—>从usesysyemproxy改成manualproxyhttp:127.0.0.1port:8080(和burpsuite设置的一样就ok),勾选上u

    2022年6月4日
    85
  • poj3819 Coverage (求直线与圆的交占直线的百分比 )

    poj3819 Coverage (求直线与圆的交占直线的百分比 )

    2022年1月25日
    45

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号