在说起全排列前,先说一下昨天碰到的一个题目(答案不是我做出来的,但是我感觉有好多个亮点,贴出来方便日后的学习):

素数环

时间限制: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

这个题的解法我考虑了很久,怎么说呢,感觉上并不是一道难度很大的题,实际操作起来却又无从下手。我说一下我的思考过程首先,这牵扯到寻找素数,但是呢,不是简单的找素数,而是两个数的和,在[1,n]之间的两个数m,n的和

        有多组测试数据,每组输入一个n(0<n<20),n=0表示输入结束。

这句话可以看出输入的n,最大,也就20.那么,即使在跑程序的时候,当真输入为20,最大的的一个和值也就是20+20=40,那么,我完全可以把[1,40]间的素数全部找出来并建立一个数组s[40],然后在[1,n]间查看,看哪两个数的和是素数,通过在数组s[40]里查找是否符合,若符合,将符合的值存放在一个数组里,而后输出。
#include <stdio.h>
#include<string.h>
int count,sa[40];    //  coount 用于控制输出流    sa[]是一个用来显示区间[2,42]内每个数是否为素数的数组,若为素数,其对应的sa[j]=1/*** found 函数的定义,据作者说是由全排列改编过来的 ***/ void found(int n,int cur,int a[],int flag[]){  // 传入的 n 为 in[]数组中的元素,即输入值;  cur 初始值为1  是用于控制a[]的下标  ; a[]是一个a[0]=1的用于存放可满足数的数组; // flag[]是一个初始值全部置0的数组 , 用于储存在判定检查过程中的数是否为要用的值后的布尔值if(cur==n&&sa[a[0]+a[cur-1]])            // 这里用cur 与 输入值 n 进行比较判断  也就是说 a数组里存放的个数最多 n个,最多把[1,n]之间的值全部放进去,或者说数组a里的最大值肯定不能大于n
{                                     {                                         for(int i=0;i<n;i++)            printf("%d ",a[i]);                //  那么,当a数组检查n是否可以存放时,这次遍历也就到此结束了,也就是该输出数组a了putchar('\n');                    count=0;                            }
}
/***** 在cur!=n时,需要进一步的检查时,利用递归,在区间[2,n],以此将满足的数存放在a[]中 *****/else                                                                                   //
        for(int i=2;i<=n;i++)                                                              //
        if(!flag[i]&&sa[i+a[cur-1]])                                                       //              {                                                                               //
            a[cur]=i;                                                                  //
            flag[i]=1;                                                                //
            found(n,cur+1,a,flag);                                                   //
            flag[i]=0;                                                              //
        }                                                                          //
}                                                                                 //
/*********************************************************************************/
int main(void)
{int i=0,a[20],in[100],flag[20];   // in[20] 用于存放输入 memset(sa,0,sizeof(sa));            memset(flag,0,sizeof(flag));
/***********************************************************/ for(int ok=1,k=2,j=2;j<40;j++,ok=1)                   //
    {                                                    //
        for(int i=2;i<=j/2;i++)                         //   在区间[2,40]里进行是否为素数的判定   用j控制数组sa的下标,同时,j还是一个数列【2,,40】 {                                              //
            if(j%i==0)    ok=0;                       //  若为素数,sa[j]=1,否则不对sa[j]处理,即为0 }                                            //
        if(ok) sa[j]=1;                             //
    }                                              //
/**************************************************/    /**************************************/do                                  //    我很喜欢这段控制输入的代码{                                 //     scanf("%d",&in[i++]);      //   很简单  但是很巧妙 }while(in[i-1]);              //
/********************************///        大方  优雅 a[0]=1;    for(int j=1;j<i;j++)        {count=1;   printf("Case %d:\n",j);  // j 显示输入的数据的个数  if(!(in[j-1]%2)||in[j-1]==1) found(in[j-1],1,a,flag);  // if里判定 in[]数组里的元素是否为奇数 或者是为1   两种情况均调用函数 if(count)    printf("No Answer\n");   } return 0;
}

先简单简单注释一下,可能在匆忙之中有一些错误,哪位有发现,多谢指出

转载于:https://www.cnblogs.com/zhangzimu/p/6187187.html

素数环 与 算法 全排列相关推荐

  1. 质数环问题c语言,素数环问题

    问题描述:将从1到n这n个整数围成一个圆环,若其中任意2个相邻的数字相加,结果均为素数,那么这个环就成为素数环. n=20时,下面的序列就是一个素数环: 1 2 3 4 7 6 5 8 9 10 13 ...

  2. 美丽的项链(素数环)(回溯法)

    题目描述 520马上就要到了,丁丁妹在思考送自己的室友什么礼物能够彰显她深深的室友之爱. 由于丁丁妹最近沉迷于数学,于是她想出了一个绝(土)妙(味)的礼物--素数项链. 具体而言,素数项链是一个由1~ ...

  3. 素数环问题 DFS

    素数环问题 将从1到n这n个整数围成一个圆环, 若其中任意2个相邻的数字相加,结果均为素数,那么这个环就成为素数环. 现要求输入一个n,求n个数围成一圈有多少种素数环, 规定第一个数字是1.写出相应的 ...

  4. 素数环问题---深度搜索遍历

    1264: 素数环 时间限制: 1 Sec  内存限制: 128 MB 提交: 29  解决: 8 [提交][状态][讨论版] 题目描述 有一个长度为n的环形序列由1,2,3,...,n组成,环中相邻 ...

  5. 一致性环Hash算法.NET实现

    一致性环Hash算法有一个大用处就是解决Memcache服务器down机问题的.目的是增加或者移除Memcache服务器后,最大限度的减少所受影响. 理论方面的就不介绍了,网上有太多资料了,请大家自己 ...

  6. 【数据结构与算法】判断单链表是否有环的算法

    带环链表 这里的带环单链表可不是环形单链表,这个环可能是我们不想要的,所以需要检测. 我们就不假设有一个打结状的环了,那样跑到哪里去也不清楚,这里的"带环链表",环必然是在末端. ...

  7. 判断素数或者求出素数的基本算法 《挑战程序设计竞赛》

    2018-2-28 首先我们得明确一个概念,那就是什么是素数,据我的了解,素数就是除了1和它本身之外,不存在其他的因数的数. 1.素性测试 判断给定的数n是否是素数 这应该是最简单的了,直接从2至n, ...

  8. 编程解决素数环问题Java_回溯法解决素数环问题java实现

    素数环问题: 输入正整数n,把整数1,2,3--,n组成一个环,使得相邻两个整数之和均为素数,输出所有方案,注意同一个环应恰好输出一次.n<==16 样例输入: 6 样例输出: 1 4 3 2  ...

  9. java算法排列式_JAVA 蓝桥杯算法 全排列 背公式即可

    什么是全排列? 所谓全排列就是把几个字符或数字(以下称为元素),进行全部排列 例如:字符串 abc 那么就可以这样排abc acb bac bca cab cba 把全部元素能用到的排列方式进行全部排 ...

最新文章

  1. cython编码报错
  2. JDBC连接mysql数据库操作
  3. 基于abp vnext制作项目脚手架
  4. 《dp补卡——买卖股票问题》
  5. 别再无脑wwm了!在下游任务中不一定有效!
  6. ubuntu部署tomcat
  7. unity 草 可以一棵棵种吗?_这种野草人称“瓜子金”,1斤能卖50多,拔1棵少棵很珍贵...
  8. 直播不是造车,特斯拉开店玩直播却栽了个“跟头”
  9. 【转】每天一个linux命令(61):wget命令
  10. matlab划分训练集验证和测试集代码_Matlab随机划分训练集和测试集
  11. Win10 安装IE11失败错误代码0x80070490(未解决)
  12. 计算机上怎么设置qq隐藏图标,QQ图标隐藏了怎么弄出来
  13. 斯坦福大学区块链期末考试题
  14. HTML学习笔记9——CSS3制作网页动画
  15. 【阅读总结】Xen and the Art of Virtualization
  16. 广工Anyview数据结构2021-C语言版--第一章
  17. python 占位符(百分号方式、Format 方式)
  18. 编程萌新必看!初学C语言必会的知识点,你学废了吗?
  19. 如何使用netsh advfirewall firewall而不是netsh firewall控制Windows Server 2008的防火墙行为
  20. Niagara Networks和Fortinet安全解决方案

热门文章

  1. 基于SuperSocket的IIS主动推送消息给android客户端
  2. WINFORM如何只弹出一个子窗体
  3. 如何保证MongoDB的安全性? 1
  4. Showdoc 搭建项目 API 文档系统
  5. spring MVC中页面添加锚点
  6. SQLite/嵌入式数据库
  7. grep/egrep和正则表达式汇总
  8. 【excel技巧读书笔记001】清除打开过的文件记录
  9. 感谢大家对我微软TECHED2013课程的支持
  10. 推荐一款移动端的web UI控件 -- mobiscroll