质数环

简介: 输入N,将1~N这N个整数摆成一个环,使得任意相邻两个数之和都是质数。 分析: 递归,回溯 算法的流程:递归填数:判断第i个数填入是否合法。 若是合法:填数,判断是否到达目标(填入20个数字),是则打印结果,否则递归进入下一层填写下一个数字。

输入N,将1~N这N个整数摆成一个环,使得任意相邻两个数之和都是质数。

分析:

递归,回溯

算法的流程:递归填数:判断第i个数填入是否合法。

若是合法:填数,判断是否到达目标(填入20个数字),是则打印结果,否则递归进入下一层填写下一个数字。

若是不合法:选择下一种可能进行尝试。

代码如下:(不足之处在于:这里输出的环可能本质是相同的,也就是会有重复。如何改进请看代码二)

 1 #include<stdio.h>
 2 #include<stdlib.h>
 3 #include<math.h>
 4 int N;
 5 int b[21]={0};
 6 int total=0,a[21]={0};
 7 int search(int);        //回溯过程
 8 int print();            //输出方案
 9 int pd(int x,int y);    //判断素数x+y是否质数
10 
11 int main()
12 {
13     scanf("%d",&N);
14     search(1);
15     printf("%d\n",total);                    //输出总方案数
16 }
17 int search(int t)
18 {
19     int i;
20     for(i=1;i<=N;i++)           //有20个数可选
21      if((!b[i])&&pd(a[t-1],i))  //判断与前一个数是否构成素数及该数是否可用
22      {
23          a[t]=i;
24          b[i]=1;
25          if (t==N) { if(pd(a[N],a[1])==1) print();}
26          else search(t+1);
27          b[i]=0;
28      }
29 }
30 int print()
31 {
32    int j;
33    total++;
34    printf("<%d>",total);
35    for(j=1;j<=N;j++)
36        printf("%d ",a[j]);
37    printf("\n");
38 }
39 int pd(int x,int y)
40 {
41     int k=2,i=x+y;
42     while(k<=sqrt(i)&&i%k!=0) k++;
43     if(k>sqrt(i)) return 1;
44     else return 0;
45 }

想要去除重复的环,只需要固定环中的某一个位置取某一个值就行。比如:规定环的第一个元素取1.当然,这样规定后,以后每一次递归回溯选择的时候都不能选2了,所以,search函数里面,for循环的起始值为2.

 1 #include<stdio.h>
 2 #include<stdlib.h>
 3 #include<math.h>
 4 int N;
 5 int b[21]={0};
 6 int total=0,a[21]={0};
 7 int search(int);        //回溯过程
 8 int print();            //输出方案
 9 int pd(int x,int y);    //判断素数x+y是否质数
10 
11 int main()
12 {
13     scanf("%d",&N);
14     a[1]=1;
15     search(2);
16     printf("%d\n",total);                    //输出总方案数
17 }
18 int search(int t)
19 {
20     int i;
21     for(i=2;i<=N;i++)           //有20个数可选
22      if((!b[i])&&pd(a[t-1],i))  //判断与前一个数是否构成素数及该数是否可用
23      {
24          a[t]=i;
25          b[i]=1;
26          if (t==N) { if(pd(a[N],a[1])==1) print();}
27          else search(t+1);
28          b[i]=0;
29      }
30 }
31 int print()
32 {
33    int j;
34    total++;
35    printf("<%d>",total);
36    for(j=1;j<=N;j++)
37        printf("%d ",a[j]);
38    printf("\n");
39 }
40 int pd(int x,int y)
41 {
42     int k=2,i=x+y;
43     while(k<=sqrt(i)&&i%k!=0) k++;
44     if(k>sqrt(i)) return 1;
45     else return 0;
46 }
View Code

 

相关文章
|
NoSQL 关系型数据库 MySQL
泛微Ecology9+Emobile7部署
泛微OA的平台化,相比之下,的确是很不错,为方便公司内部考勤,加班审批,报销等流程,这边采用泛微的E9
6030 0
泛微Ecology9+Emobile7部署
|
传感器 监控
基于STM32的智能农业环境监测系统设计与实现
基于STM32的智能农业环境监测系统设计与实现
945 0
|
11月前
|
Unix Linux Go
go进阶编程:Golang中的文件与文件夹操作指南
本文详细介绍了Golang中文件与文件夹的基本操作,包括读取、写入、创建、删除和遍历等。通过示例代码展示了如何使用`os`和`io/ioutil`包进行文件操作,并强调了错误处理、权限控制和路径问题的重要性。适合初学者和有经验的开发者参考。
185 4
|
JavaScript 前端开发 开发者
JavaScript基础入门之浏览器控制台调试输出
本文章是对小白学习js的初级教程,也是我对自己学习经验的一种总结,文章大多采用使用案例加讲解,带动学习的方式.因为我们的天性总是喜欢有及时反馈的事物,但是学习是一个慢长的事情,而有结果的回应,才会更好的促进自己去学习,主要是对于javascript学习中的输出,有个大体上的了解,同时通过教学能够更好的使用浏览器来方便我们去学习和运行代码,也是对自己进行笔记整理,对抓住信息关键点的一种提高.
|
数据采集 Java Python
python并发编程:Python在FastAPI服务中使用多进程池加速程序运行
python并发编程:Python在FastAPI服务中使用多进程池加速程序运行
1934 0
|
Web App开发
【视频点播】阿里云视频点播如何获取视频播放的URL
展示如何使用阿里云视频点播服务获取播放地址.
35326 0
【视频点播】阿里云视频点播如何获取视频播放的URL
|
JavaScript Java Linux
【vim && neovim】从入门到放弃(“四种”模式、常用命令、正则表达式、文件属性、插件安装--代码补全、一键格式化、显示目录)(三)
本文所有操作均通过ssh连接腾讯云服务器完成。如果你正在使用安装GNOME桌面的Linux,很多操作可以通过鼠标完成,或许更加直观。 推荐使用neovim(结合鼠标操作更加丝滑)。
|
JavaScript 前端开发
Vue 和 jQuery 两者之间的区别是什么?
Vue 和 jQuery 两者之间的区别是什么?
324 0
《QT从基础到进阶·十八》QT中的各种鼠标事件QEvent
《QT从基础到进阶·十八》QT中的各种鼠标事件QEvent
420 0
|
网络协议 网络架构
计算机网络的层次结构
计算机网络的层次结构
计算机网络的层次结构