Java学习者论坛

 找回密码
 立即注册

QQ登录

只需一步,快速开始

手机号码,快捷登录

恭喜Java学习者论坛(https://www.javaxxz.com)已经为数万Java学习者服务超过8年了!积累会员资料超过10000G+
成为本站VIP会员,下载本站10000G+会员资源,购买链接:点击进入购买VIP会员
JAVA高级面试进阶视频教程Java架构师系统进阶VIP课程

分布式高可用全栈开发微服务教程

Go语言视频零基础入门到精通

Java架构师3期(课件+源码)

Java开发全终端实战租房项目视频教程

SpringBoot2.X入门到高级使用教程

大数据培训第六期全套视频教程

深度学习(CNN RNN GAN)算法原理

Java亿级流量电商系统视频教程

互联网架构师视频教程

年薪50万Spark2.0从入门到精通

年薪50万!人工智能学习路线教程

年薪50万!大数据从入门到精通学习路线年薪50万!机器学习入门到精通视频教程
仿小米商城类app和小程序视频教程深度学习数据分析基础到实战最新黑马javaEE2.1就业课程从 0到JVM实战高手教程 MySQL入门到精通教程
查看: 675|回复: 0

[算法学习]素数环问题

[复制链接]
  • TA的每日心情
    开心
    2021-3-12 23:18
  • 签到天数: 2 天

    [LV.1]初来乍到

    发表于 2014-11-6 00:03:20 | 显示全部楼层 |阅读模式
    问题描述:
             将从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,终于可以了,继续往下试验……

    代码编写:
    1. import java.util.Arrays;
    2. import java.util.Random;
    3. public class MyTest {
    4.     public static void main(String[] args) {
    5.         
    6.         int length = 22;      //素数环的长度
    7.         int[] b = new int[length];    //一个数组,用来标识第i个数字是否被使用过。
    8.         Arrays.fill(b, 0);      //将数组初始化为0,标识所有数字尚未被使用
    9.         int[] ring = new int[length];      //用于存放最终素数环的数组
    10.         ring[0] = 1;                    //素数环的第一个数字必然为1(因为是个环,我们从1那一点开始考虑就行了)
    11.         if(primeNumRing(b, ring, 1))
    12.             printArray(ring);
    13.         else
    14.             System.out.println("不存在素数环");
    15.     }
    16.    
    17.         //负责打印数组,最后输出素数环的时候用得着
    18.     public static void printArray(int a[]) {
    19.         for(int x:a) {
    20.             System.out.print(x+"  ");
    21.         }
    22.         System.out.println();
    23.     }
    24.    
    25.         //用递归的方法判断素数环
    26.         //数组b用来标识某个数字是否被使用过了,数组ring用来存储素数环
    27.        //整数n表示当前正在考察素数环中的第几个数字
    28.     private static boolean primeNumRing(int[] b, int[] ring, int n) {
    29.                //当最后一个数字考察完毕后,测试一下他加上第一个数字(也就是1)是不是素数
    30.                //如果是素数,那么就说明找到了素数环,如果不是,则没有找到
    31.         if(n == b.length)
    32.             return isPrimeNum(ring[n-1]+1);
    33.                //start是循环的开始点,因为奇数的旁边必然是偶数,偶数的旁边必然是奇数
    34.               //因此若前一个数是偶数,那么当前考察的必然全是奇数,反之亦然
    35.               //因此,循环的跨度为2
    36.         int start = 2-n%2;
    37.         for(int i=start; i< b.length; i+=2) {
    38.                         //如果当前考察的数字没有被使用过,并且和前一个数字相加的和为素数的话
    39.             if(b[i]==0 && isPrimeNum((i+1)+ring[n-1])) {
    40.                 b[i] = 1;            //将其标识设置为"已使用"
    41.                 ring[n] = i+1;   //将其放入素数环中
    42.                                 //如果他后面的所有数字都符合要求,则找到素数环,反之将标识清零后,考察下一个数字
    43.                 if(primeNumRing(b, ring, n+1))
    44.                     return true;
    45.                 else
    46.                     b[i] = 0;
    47.             }
    48.         }
    49.         return false;
    50.     }
    51.    
    52.         //判断一个数是否为素数
    53.        //这里没有使用通用的判别方法,一般来讲,素数环都不会超过30个数字
    54.        //因此需要判断的最大的数字不会超过60。
    55.        //本函数的测试因子最大为11,也就是说凡是小于168(13的平方)的素数都能够被判断,够用了
    56.     private static boolean isPrimeNum(int x) {
    57.         int[] primeNums = {2, 3, 5, 7, 11};
    58.         int i;
    59.         for(i=0; i< primeNums.length; i++) {
    60.             if(x>primeNums[i] && x%primeNums[i] == 0)
    61.                 break;
    62.         }
    63.         return (i==primeNums.length);
    64.     }
    65. }
    66. 运行结果:
    67. C:java>java    MyTest
    68. 1  2  3  4  7  6  5  8  9  10  13  16  15  14  17  12  11  20  21  22  19  18

    复制代码

    源码下载:http://file.javaxxz.com/2014/11/6/000320671.zip
    回复

    使用道具 举报

    您需要登录后才可以回帖 登录 | 立即注册

    本版积分规则

    QQ|手机版|Java学习者论坛 ( 声明:本站资料整理自互联网,用于Java学习者交流学习使用,对资料版权不负任何法律责任,若有侵权请及时联系客服屏蔽删除 )

    GMT+8, 2025-2-25 11:12 , Processed in 0.344441 second(s), 35 queries .

    Powered by Discuz! X3.4

    © 2001-2017 Comsenz Inc.

    快速回复 返回顶部 返回列表