素数环
2016-05-10 19:32
239 查看
描述 有一个整数n,把从1到n的数字无重复的排列成环,且使每相邻两个数(包括首尾)的和都为素数,称为素数环。 为了简便起见,我们规定每个素数环都从1开始。 输入 有多组测试数据,每组输入一个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> int prime[40] = {0,0,1,1,0,1,0,1,0,0,0,1,0,1,0,0,0,1,0,1,0,0,0,1,0,0,0,0,0,1,0,1,0,0,0,0,0,1,0,0}; //40 以内 的 素数,0代表 非素数,1代表素数 int a[21];//起标记作用 int ring[21]; //素数环 里面的 数 void dfs(int k,int n) { int i; if( k == n + 1 && prime[ ring + ring[1] ] ) // 首尾相加之和也为 素数的 { printf("1"); for(i = 2; i <= n; i++) printf(" %d",ring[i]); // 把 2 之后的素数 输出来 printf("\n"); return ; } for(i = 2; i <= n; i++) { if(!a[i] && prime[i + ring[k-1] ]) // 如果这个数当前没用过 && 和之前的数 相加的和为素数,就继续执行 { a[i] = 1; // 这个数已经用过 ring[k] = i; // 把当前的数 存在素数环中 dfs(k + 1,n); // 继续 寻找下一个 符合条件的 数 a[i] = 0; // 把刚才尝试的数 召回,把它看作是没有用过 } } } int main() { int T,n; T = 1; while(~scanf("%d",&n),n) { printf("Case %d:\n",T++); if(n == 1) { printf("1\n"); continue; } if(n & 1) { printf("No Answer\n"); // 如果 n 是奇数 ,就是 No Answer continue; } memset(a,0,sizeof(a)); a[1] = ring[1] = 1; // 因为题目要求 只能输出 以 1 开头的数 dfs(2,n); // 所以从 2 开始搜索 } return 0; }
相关文章推荐
- Symbol path 设置
- hihocoder #1038 : 01背包
- XML文件的解析
- modbus 工具
- 浅谈Lucene中的DocValues
- C++网络
- static
- nrf51822 --- spi 通信
- sshd服务
- ionic入门教程第十五课-ionic性能优化之图片延时加载
- HDU 百度之星(测试赛)1001 - 大搬家
- 第十、十一周项目1:阅读程序,写出执行结果(2)
- extentreports报告插件与testng集成(一)
- 设置eclipse默认用户名
- mipi 调试经验
- c++作业5
- java线程状态图;
- 各种排序方法汇总
- poj 2125 【最小割】
- linux之CentOS将普通的命令加入环境变量