素数环问题

【基础算法素数环 题目描述 输入正整数n,把整数1,2,3,…,n组成一个环,使得相邻两个整数之和均为素数。小强同学看过这个题,笑了:呵呵,打表! Mr. Wu为了阻止小强打表,决定这样: 把全部的解按字典序排序后,从1开始编号,依次输出指定编号的k组解。最后一行输出总的方案数。同一个素数环只算一次。 输入 第1行:2个整数,n(n 第2行:共有k个从小到大排列的整数,表示要输出的解的编号。 阅读详情
问题描述:
        将从1到n这n个整数围成一个圆环,若其中任意2个相邻的数字相加,结果均为素数,那么这个环就成为素数环。

20以内的素数环:
1  2  3  4 
1  4  3  2  5  6
1  2  3  8  5  6  7  4
1  2  3  4  7  6  5  8  9  10
1  2  3  4  7  6  5  12  11  8  9  10 
1  2  3  4  7  6  13  10  9  14  5  8  11  12
1  2  3  4  7  6  5  12  11  8  9  14  15  16  13  10
1  2  3  4  7  6  5  8  9  10  13  16  15  14  17  12  11  18
1  2  3  4  7  6  5  8  9  10  13  16  15  14  17  20  11  12  19  18

算法设计:
        利用回溯法穷举所有可能性,找到一个后,结束程序。具体来讲,就是在第一个位置先设置为1,然后第二个位置试试2行不行,再在第三个位置试试3行不行,再在第四个位置试试4行不行,再在第五个位置试试5,发现不行,然后试试6,发现还不行,再试试7,终于可以了,继续往下试验……

代码编写:
import java.util.Arrays;
import java.util.Random;

public class MyTest {
    
public static void main(String[] args) {
        
        
int length = 22;      //素数环的长度
        int[] b = new int[length];    //一个数组,用来标识第i个数字是否被使用过。
        Arrays.fill(b, 0);      //将数组初始化为0,标识所有数字尚未被使用
        int[] ring = new int[length];      //用于存放最终素数环的数组
        ring[0= 1;                                //素数环的第一个数字必然为1(因为是个环,我们从1那一点开始考虑就行了)
        if(primeNumRing(b, ring, 1))
            printArray(ring);
        
else
            System.out.println(
"不存在素数环");

    }

    
        
//负责打印数组,最后输出素数环的时候用得着
    public static void printArray(int a[]) {
        
for(int x:a) {
            System.out.print(x
+"  ");
        }

        System.out.println();
    }

    
        
//用递归的方法判断素数环
        
//数组b用来标识某个数字是否被使用过了,数组ring用来存储素数环
       
//整数n表示当前正在考察素数环中的第几个数字
    private static boolean primeNumRing(int[] b, int[] ring, int n) {
               
//当最后一个数字考察完毕后,测试一下他加上第一个数字(也就是1)是不是素数
               
//如果是素数,那么就说明找到了素数环,如果不是,则没有找到
        if(n == b.length)
            
return isPrimeNum(ring[n-1]+1);
               
//start是循环的开始点,因为奇数的旁边必然是偶数,偶数的旁边必然是奇数
              
//因此若前一个数是偶数,那么当前考察的必然全是奇数,反之亦然
              
//因此,循环的跨度为2
        int start = 2-n%2;
        
for(int i=start; i<b.length; i+=2{
                        
//如果当前考察的数字没有被使用过,并且和前一个数字相加的和为素数的话
            if(b[i]==0 && isPrimeNum((i+1)+ring[n-1])) {
                b[i] 
= 1;            //将其标识设置为"已使用"
                ring[n] = i+1;   //将其放入素数环中
                                
//如果他后面的所有数字都符合要求,则找到素数环,反之将标识清零后,考察下一个数字
                if(primeNumRing(b, ring, n+1))
                    
return true;
                
else
                    b[i] 
= 0;
            }

        }

        
return false;
    }

    
        
//判断一个数是否为素数
       
//这里没有使用通用的判别方法,一般来讲,素数环都不会超过30个数字
       
//因此需要判断的最大的数字不会超过60。
       
//本函数的测试因子最大为11,也就是说凡是小于168(13的平方)的素数都能够被判断,够用了
    private static boolean isPrimeNum(int x) {
        
int[] primeNums = {235711};
        
int i;
        
for(i=0; i<primeNums.length; i++{
            
if(x>primeNums[i] && x%primeNums[i] == 0)
                
break;
        }

        
return (i==primeNums.length);
    }

}
 
2110:【例5.1】素数环 信息学奥赛一本通 搜索与回溯算法 排列成一个环,使得相邻两个整数之和均为素数。同时,环的首尾两个数字之和也必须是素数。 阅读详情

相关推荐

搜索与回溯算法(上):例5.1 素数环,例5.2,例5.3 自然数的拆分,例5.3 自然数的拆分(2),例5.4 八皇后问题,例5.4 八皇后问题(2)

搜索与回溯算法(上):例5.1 素数环,例5.2,例5.3 自然数的拆分,例5.3 自然数的拆分(2),例5.4 八皇后问题,例5.4 八皇后问题(2)

Dust_reast的博客 793

素数环个数

描述: 给定一组正整数,把他们排成一个环,任意相邻的两个数之和为素数的环称为素数环,问这组数能构成多少个素数环? 输入: 先输入一个正整数n,然后输入给定的n个不相同的正整数。 输出: 输出这组数能够成的素数环的个数。 输入样例: 4 1 2 3 4 输出样例: 2

素数环问题 DFS

素数环问题 将从1到n这n个整数围成一个圆环, 若其中任意2个相邻的数字相加,结果均为素数,那么这个环就成为素数环。 现要求输入一个n,求n个数围成一圈有多少种素数环, 规定第一个数字是1。写出相应的的算法思想并编程实现。 样例: (1) input: 6 output: 1 4 3 2 5 6 1 6 5 2 3 4 (2) input: 8 output: 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...

Move on 3957

素数环1-20

速度蛮快的,使用了ios::sync_with_stdio(false);

素数环

题目描述 输入一个正整数n,将从1到n这n个整数围成一个圆环,如果其中任意2个相邻的数字相加结果均为素数,那么这个环就称为素数环。 输入 输入一个正整数n,n<=16 输出 输出长度为n的素数环序列(可能的解有多个),要求从整数1开始逆时针排列,同一个环恰好输出一次。 样例输入 6 样例输出 1 4 3 2 5 6 1 6 5 2 3 4 思路: 回溯,一个个放入符合条件则输出,不符合则重新赋值,和一个原理 #include <stdio.h> int f(in

ChenJJJJJJJJ的博客 3730

ACM素数环问题(c++和python3)

素数环是一个由数字 1, 2, ..., n 构成的圆环,其中任意两个相邻数字之和均为素数,圆环中的数字不能重复。 - Input: 输入包含多组测试数据,每组数据占一行,为素数环的大小 n (0 < n < 18)。 - Output: 对于每组数据,按字典序大小,输出所有素数环的排列方案,排列方案的第一个数字必须是 1,每组数据后要输出一个空行。

qq_33163046的博客 6720

素数环问题(回溯法)

素数环是一个计算机程序问题,指的是将从1到n这n个整数围成一个圆环,若其中任意2个相邻的数字相加,结果均为素数,那么这个环就成为素数环。 现在要求输入一个n,求n个数围成一圈有多少种素数环,规定第一个数字是1。 #include&lt;iostream&gt; #include&lt;math.h&gt; using namespace std; int n=0; int a[100];...

kkkkkkkk的博客 1万+

求解素数环问题

素数:   质数(prime number)又称素数,有无限个。一个大于1的自然数,除了1和它本身外,不能被其他自然数整除(除0以外)的数称之为素数(质数);否则称为合数。根据算术基本定理,每一个比1大的整数,要么本身是一个质数,要么可以写成一系列质数的乘积;而且如果不考虑这些质数在乘积中的顺序,那么写出来的形式是唯一的。最小的质数是2。 素数环:   将从1到n这n个整数围成一

雪夜&流星的专栏 1166

C++——素数环问题

 素数环问题 时限:1000ms 内存限制:10000K 总时限:3000ms 描述:   把1到20这重新排列,使得排列后的序列A满足: a. 任意相邻两个数之和是素数 b. 不存在满足条件a的序列B使得:A和B的前k(0 &lt;= k &lt;= 19)项相同且B的第k+1项比A的第k+1项小。(即按字典序排列的第一项) 输入:   没有输入。 输出:   输出A,...

chengchencheng的博客 4492

NOJ-1008-素数环问题

素数环问题 代码: #include<cstdio> #include<cstring> #include<iostream> #include<algorithm> #include<cmath> using namespace std; const int maxn=105; int n=20,vis[maxn],a[maxn],cnt; void swap(int x,int y){ int t=a[x]; a[x]=a[y]; a[

Phoenix_ZengHao的博客 497

素数环问题的非递归实现

     关于素数环问题,我在早先的一个帖子里已经做了详细的说明。那时候我用的是递归的方式来实现的。今天我又使用非递归的方式把这个问题做了一遍,有兴趣的网友可以一起探讨!package andycpp;public class Main ...{    public static void main(String[] args) ...{        primering(20);    

华丽的痘痘 2821

回溯与搜索之素数环问题

/** 素数环是一个计算机程序问题,指的是将从1到n这n个整数围成一个圆环,若其中任意2个相邻的数字相加,结果均为素数, 那么这个环就成为素数环。 现在要求输入一个n,求n个数围成一圈有多少种素数环,规定第一个数字是1。 */ #include&lt;iostream&gt; #include&lt;math.h&gt; #include&lt;algorithm&gt; #include&...

Mind_programmonkey的博客 603

c语言素数环问题(回溯)

Problem F 素数环问题 时限:1000ms 内存限制:10000K 总时限:3000ms 描述: 把1到20这重新排列,使得排列后的序列A满足: a. 任意相邻两个数之和是素数 b. 不存在满足条件a的序列B使得:A和B的前k(0 输入: 没有输入。 输出: 输出A,两个数字之间用一个空格隔开,第一个数字前面和最后一个数字后面没有空格。 输入样例

geshengtong的博客 7059
上一篇: 手把手教你在Eclipse+Tomcat环境下使用JSTL
下一篇: 写出第一个Swing程序
andycpp
博客等级 码龄22年 699粉丝 72原创
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值