素数概念

只能被1和本身整除,

需求

指定一个值,取范围内的所有质数

1.普通算法

基本概念:判断这个数,是否存在,能整除大于1小于本身的数(例:6可以整除,2和3,就不是质数)

过滤条件:只判断最小的因数,(例如:6的因数,判断了2,就不需判断3)

所以因数的取值范围最大就是,这个基数的开方。

 /*** 方式1*/private void test1(int n) {int count=0;StringBuilder sb = new StringBuilder();sb.append(2);sb.append(",");for(int i = 3;i<=n;i++){boolean isP=true;for(int j = 2;j <= Math.sqrt(i);j++){count+=1;if(i%j==0) {isP=false;break;}}if(isP) {sb.append(i);sb.append(",");}}System.out.println(count+":"+sb.toString());}

2.埃式筛法(每找到一个素数将它的倍数筛掉)

基本概念:当2是质数,将4,6,8...都筛掉,剩下的继续

下一个处理3是质数,将3的倍数,6,9,12..都筛掉,剩下继续

下一个5,以此类推。

缺陷:每个相同的倍数被筛选多次(例如:6会被2和3都做一次筛选)

 /*** 方式二* 埃式筛法*/private void test2(int n) {// 从2开始找// 每找到一个将倍速筛掉// 素数集合int[] primes = new int[n+1];int cnt=0;// 素数集合下标// 初期化,下标默认判断boolean[] st = new boolean[n+1];for (int i = 0; i<=n; i++) {st[i] = false;}int count=0;for (int i = 2; i<=n; i++) {// 判定当前下标值是否已经判定过了,例如6在2判定过,3不再判定if (!st[i]) {primes[cnt++]=i;for (int j=i*i; j<=n; j+=i) {//这里2的场合筛选了4,6,8,10,12..没意义//3的场合,会筛12,重复了st[j] = true;count+=1;}}}StringBuilder sb = new StringBuilder();for (int i=0; i<primes.length;i++) {sb.append(primes[i]);sb.append(",");}System.out.println(count+":"+sb.toString());}

3.欧拉筛法

    基本概念: 筛掉当前处理的基数的比这个基数小的所有的质数的倍数(例如:基数2,将基数2和质数2的倍数4筛掉,处理基数3就将,3和2的倍数6筛掉,处理4就将,2*4和3*4筛掉,以此类推)

原理1:双数一定会被2筛掉。

原理2:为什么用质数的倍数,因为不是质数,就一定有比本身小的因数,在处理比本身小的因数时就已经筛过了。

 /*** 方式三* 欧拉筛法(埃式筛法的优化)*/private void test3(int n) {// 素数集合int[] primes = new int[n+1];int cnt=0;// 素数集合下标int count=0;// 初期化,下标默认判断boolean[] st = new boolean[n+1];for (int i = 0; i<=n; i++) {st[i] = false;}for (int i = 2; i<=n; i++) {if (!st[i]) {primes[cnt++]=i;}for (int j=0;j<cnt && i * primes[j] <= n;j++) {// 去掉质数的倍数st[primes[j]*i] = true;count+=1;// 除质数能除开,便不是质数if(i%primes[j]==0)break;}}StringBuilder sb = new StringBuilder();for (int i=0; i<primes.length;i++) {sb.append(primes[i]);sb.append(",");}System.out.println(count+":"+sb.toString());}

4.自定义函数(自己改了一个函数)

原理1:2以外,双数不做判断(直接用i+=2来循环)节约一半的处理。

原理2:只判断质数的倍数(参照上记3)

原理3:倍数的选择(不是1开始累加)而是从自身的平方开始(例如7的平方,49开始筛查,如果是21在3的倍数筛过滤,所以7不筛了)

原理4:只筛查双数倍(例如:7从49筛,那么单数倍56不筛查(因为一定是偶数),只筛查双数倍63开始)

private void test4(int n) {// 初期化,下标默认判断boolean[] st = new boolean[n+1];// 素数集合int[] primes = new int[n+1];int cnt=0;// 素数集合下标primes[cnt++]=2;int count=0;for (int i = 3; i<=n; i+=2) {if (!st[i]) {primes[cnt++]=i;for (int j=i*i; j<=n; j+=(i*2)) {st[j] = true;count+=1;}}}StringBuilder sb = new StringBuilder();for (int i=0; i<primes.length;i++) {sb.append(primes[i]);sb.append(",");}System.out.println(count+":"+sb.toString());}

总结:

注意:本文代码以Int为类型,所以不要传,比int最大值的开方大的数会异常,可以将代码中i*i<n的部分修正为i<sqrt(n))。

测试:以取10000以内素数为例,

方法1:运算了 117,527次,

方法2:运行了  16,981次,

方法3:运行了    8,770次,

方法4:运行了    5,995次,

只限于循环次数,没有计算运行时间,具体效率大家自行摸索。

方法4系原创方法,如若引用方法4的计算逻辑请注明出处。

java取素数(质数)相关推荐

  1. 自然数 素数 质数_在Java中获取素数的无限列表

    自然数 素数 质数 一个常见的问题是确定数字的素因式分解. 蛮力方法是审判部门( 维基百科 , 可汗学院 ),但是如果必须考虑多个数字,这需要大量的浪费工作. 一种广泛使用的解决方案是Eratosth ...

  2. Java实现求质数(素数)

    Java实现求质数(素数) 题目要求: 输出0-100以内的所有质数(素数). 质数:只能被 1 和它本身整除的数. 1不是素数也不是合数. 代码实现: public class PrimeNumbe ...

  3. 用JAVA判断一个数是否为素数(质数)

    素数(prime number)又称质数,有无限个.质数定义为在大于1的自然数中,除了1和它本身以外不再有其他因数的数称为质数. 有时经常遇到用java判断素数的问题,为大家贴上怎么用java判断出一 ...

  4. Java中判断质数的方法

    Java中判断质数的几种方法 说明: 1.质数:又称素数.是一个大于1的自然数(最小质数为2).除了1和它自身外,不能被其他自然数整除的数. =>质数:用n除[2,n-1]的所有数,不能整除就是 ...

  5. c++第n小的质数_形形色色的素数 -- 质数定理

    大家好,我是大老李.这集节目属于补课,因为我们讲了半天质数,还没有讲质数定理,虽然我在节目里已经多次提到质数定理. 那什么是质数定理?它是一系列有关质数数量和分布情况的定理和猜想.其中有一个最主要命题 ...

  6. java 查找素数_在Java中查找和检查素数

    java 查找素数 什么是质数? (What is a Prime Number?) A prime number is a natural number greater than 1 that is ...

  7. 自然数 素数 质数_俄罗斯娃娃素数

    自然数 素数 质数 As a child, weren't you in wonder of Russian Dolls, and where you learnt how the dolls fit ...

  8. 素数(质数)判断方法

    https://blog.csdn.net/songyunli1111/article/details/78690447  ->通俗易懂的解释 标准版:大部分人都知道的比较快的方法:判断从2到s ...

  9. Java % (取模)运算

    取模怎么算     取模运算实际上是计算两数相除以后的余数.假设 q 是 a.b 相除产生的商(quotient),r 是相应的余数(remainder),那么在几乎所有的计算系统中,都满足: a = ...

最新文章

  1. Java基础-Eclipse第三方安装包管理工具之Maven
  2. python字典随机取数
  3. StringWriter/PrintWriter在Java输出异常信息中的作用
  4. volatile关键字的作用-适用场景
  5. vue 给标签添加data属性_在Vue中获取自定义属性方法:data-id的实例
  6. Flutter应用进行自动化测试
  7. 第一章 Java代码执行流程
  8. WPF中的TreeView入门
  9. python解释器安装过程
  10. RSA攻击手法及相应例题解析
  11. 十分钟智商运动 李永乐 第2章 奇妙的物理
  12. SVG转换为PDF的简单方法
  13. 2021秋招总结(器件方向转行数字IC设计)
  14. 功能强大的安卓刷机软件-刷机精灵提供下载
  15. oracle loop面试题,oracle存储过程面试题
  16. 读书笔记 《第二章 复盘之道》
  17. 06-手机登录token生成容联云短信验证用户认证和网关整合(网关做统一权限认证)
  18. Python爬虫百度新闻标题
  19. linux开机启动动画
  20. 计算机三年规划书1000字,大学职业生涯规划书1000字.docx

热门文章

  1. cruise纯电动汽车仿真输入模板,个人整理,共8个表单,包含校核清单,整车参数
  2. OpenWrt挂载U盘
  3. 公司绩效考评系统 -- 数据库设计, 接口方法
  4. WebService基础使用(一)
  5. JS获取当前时间戳并转换为日期(24小时)
  6. axios请求数据和拦截
  7. VS2017工程总是很大?如何删除VS2017工程一些中间文件
  8. JSON教程(非常详细)
  9. 在网络笔记本电脑或MID上测试驱动Moblin
  10. html超链接悬浮,下列css代码,能控制鼠标悬浮其上的超链接样式