Ka的递归编程练习 Part7|素数环!

 1 #include <stdio.h>
 2 #include <math.h>
 3 #define MAX 12
 4 int used[21]={0},resl[21]={0},zs[50]={0};//used=已使用 resl=结果 zs=质数
 5 int total=0;
 6 void output()
 7 {
 8     total++;
 9     printf("<%d>:",total);
10     int i;
11     for(i=1;i<=MAX;i++)
12         printf("%d ",resl[i]);
13     printf("\n");
14 }
15 int search(int n) //第n层
16 {
17     int i;
18     for(i=1;i<=MAX;i++) //20个数可选
19         if(used[i]==0&&zs[resl[n-1]+i]==1) //若这个数可选
20         {
21             resl[n]=i; //做一做标记
22             used[i]=1;
23             if(n==MAX)  //如果已经来到第MAX层
24                 {if(zs[resl[MAX]+resl[1]]==1) output();}    //这里if比较多,不像py用缩进判断语句块,还是圈起来好。
25             else search(n+1);
26             used[i]=0; //恢复给下一次准备
27         }
28 }
29 int judge(int n)
30 {
31     int i;
32     double m=sqrt(n);
33     for(i=2;i<=m;i++)
34         if(n%i==0) return -1;
35     return 1;
36 }
37 void dabiao()
38 {
39     int i;
40     for(i=1;i<=40;i++)
41     {
42         zs[i]=judge(i);
43         //printf("%d\n",zs[i]);
44     }
45
46 }
47 int main()
48 {
49     dabiao();
50     search(1);
51     return 0;
52 }
时间: 2024-08-05 11:01:35

Ka的递归编程练习 Part7|素数环!的相关文章

Ka的递归编程练习 Part4|Hanoi汉诺塔,双色汉诺塔的也有

1 #include <stdio.h> 2 void hanoi(int s,char a,char b,char c) //a是出发盘,b是中途盘,c是结束盘 3 { 4 if(s==0) return; 5 hanoi(s-1,a,c,b); //把最底下的从a借助c移动到b 6 printf("s from %c move to %c\n",a,c); 7 hanoi(s-1,b,a,c); //把刚才弄到b的借助a叠到c上 8 } 9 int main() 10

Ka的递归编程练习 Part8|回溯之二 排列组合

1 #include <stdio.h> 2 int resl[1000]={0},used[1000]={0}; 3 int n,r; 4 int tot=0; 5 void output() 6 { 7 tot++; 8 printf("<%d>:",tot); 9 int i; 10 for(i=1;i<=r;i++) 11 printf("%d ",resl[i]); 12 printf("\n"); 13

Ka的递归编程练习 Part6|简单背包问题,拒绝动规从我做起

1 #include <stdio.h> 2 #define M 10 3 int w[M]={1,3,5,7,9,11,13,15,17,19}; 4 int backpack(int n,int s) //n代表容量,s代表物品个数 5 { 6 if(n==0) return 1; //如果刚好装完,此支线满足条件,返回1 7 else if(n<0||s<=0) return 0; //此条支线出现了装一个重量超过限额或全部用完也未装满,返回0 8 else if(backp

Ka的递归编程练习 Part3|集合划分啦

1 #include<stdio.h> 2 int ss(int n,int k) 3 { 4 if(n==k||k==1) return 1; 5 return ss(n-1,k-1)+k*ss(n-1,k); 6 } 7 int main() 8 { 9 int s,n,k; 10 scanf("%d%d",&n,&k); 11 n>=k?s=ss(n,k):s=-1; 12 printf("%d",s); 13 return

nyoj 488 素数环(深搜)

素数环 时间限制:1000 ms  |  内存限制:65535 KB 难度:2 描述 有一个整数n,把从1到n的数字无重复的排列成环,且使每相邻两个数(包括首尾)的和都为素数,称为素数环. 为了简便起见,我们规定每个素数环都从1开始.例如,下图就是6的一个素数环. 输入 有多组测试数据,每组输入一个n(0<n<20),n=0表示输入结束. 输出 每组第一行输出对应的Case序号,从1开始. 如果存在满足题意叙述的素数环,从小到大输出. 否则输出No Answer. 样例输入 6 8 3 0 样

递归编程之我见

Table of Contents 1 前言 2 递归简介 3 利用数学知识深入对递归的认知 3.1 "求解最大素数伴侣数量"的实现 3.2 进一步改进 3.2.1 减少测试的重复性 3.2.2 当找到最优解时提前结束 4 完整的程序代码 前言 今天做了一个题目<素数伴侣>,具体如下: 输入:偶数个正整数,如,1,2,3,4 处理过程:将偶数个正整数进行配对处理,如a: (1,2)(3,4); b: (1,3)(2,4); c: (1,4)(2,3),配对的整数进行求和,a

素数环 与 算法 全排列

在说起全排列前,先说一下昨天碰到的一个题目(答案不是我做出来的,但是我感觉有好多个亮点,贴出来方便日后的学习): 素数环 时间限制:1000 ms  |  内存限制:65535 KB 难度:2 描述 有一个整数n,把从1到n的数字无重复的排列成环,且使每相邻两个数(包括首尾)的和都为素数,称为素数环. 为了简便起见,我们规定每个素数环都从1开始.例如,下图就是6的一个素数环. 输入 有多组测试数据,每组输入一个n(0<n<20),n=0表示输入结束. 输出 每组第一行输出对应的Case序号,从

素数环 南阳acm488(回溯法)

素数环 时间限制:1000 ms  |  内存限制:65535 KB 难度:2 描述 有一个整数n,把从1到n的数字无重复的排列成环,且使每相邻两个数(包括首尾)的和都为素数,称为素数环. 为了简便起见,我们规定每个素数环都从1开始.例如,下图就是6的一个素数环. 输入 有多组测试数据,每组输入一个n(0<n<20),n=0表示输入结束. 输出 每组第一行输出对应的Case序号,从1开始. 如果存在满足题意叙述的素数环,从小到大输出. 否则输出No Answer. 样例输入 6 8 3 0 样

HDU 1016 素数环(深搜)

Prime Ring Problem Time Limit: 4000/2000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others) Total Submission(s): 25134 Accepted Submission(s): 11222 Problem Description A ring is compose of n circles as shown in diagram. Put natural number 1,