质数(prime number)又称素数,有无限个。质数定义为在大于1的自然数中,除了1和它本身以外不再有其他因数。也可以理解为:这个数与除1之外小于它的数取余不为0,则这个数为质数。

案例

我们在学习或者面试过程中经常会问:输出100以内的所有质数

那我们简单整理一下思路:
1. 定义整型变量,i 和 j
2. 利用for循环的嵌套一个一个判断是否i能否被j整除(i % j == 0)
3. 如果能被整除,也就是说 i 不是质数
4. 定义一个标识,( isFlag = true), 如果这个标识没有被改变,这个数就是质数
5. 输出这个数,然后通过外循环进行判断下一个 i 是不是质数
代码如下:
public static void main(String[] args) {boolean isFlag = true;for (int i = 2; i < 100; i++) {for (int j = 2; j < i; j++) {if (i % j == 0) {isFlag = false;}}if (isFlag) {System.out.println(i);}isFlag = true;}
}

【拓展】这种方法对于查找100以内的质数来说还是可以的,但是如果将100改成100000呢?或者更大的数呢?那么这种方式还是否同样好用呢?于是我做了如下尝试,将100改成10000,并在代码中添加时间计数器,看最后程序运行完毕需要的时间是多少。
demo1:

public static void main(String[] args) {boolean isFlag = true;long start = System.currentTimeMillis();//获取系统当前累计毫秒数for (int i = 2; i < 100000; i++) {for (int j = 2; j < i; j++) {if (i % j == 0) {isFlag = false;}}if (isFlag) {System.out.println(i);}isFlag = true;}long end = System.currentTimeMillis();//获取系统当前累计毫秒数System.out.println("所花费的时间为" + (end - start) + "毫秒");
}

所花费的时间为13919毫秒。 (可以看到,运行效率就低了很多,当然代码运行效率与硬件也有关)

那我们该如何优化呢?

优化一

可以在if条件里面增加break,当能被整除,则不用继续循环下去了,代码如下:

public static void main(String[] args) {boolean isFlag = true;long start = System.currentTimeMillis();//获取系统当前累计毫秒数for (int i = 2; i < 100000; i++) {for (int j = 2; j < i; j++) {if (i % j == 0) {isFlag = false;break; // 优化一 :满足条件跳出循环。只对本身非质数的自然数是有效的}}if (isFlag) {System.out.println(i);}isFlag = true;}long end = System.currentTimeMillis();//获取系统当前累计毫秒数System.out.println("所花费的时间为" + (end - start) + "毫秒");
}

所花费的时间为1136毫秒,这个时候就可以看到运行效率快了很多,但这还不是最优解法,可以看一下优化二。

优化二

上面我们使用break优化,满足了对本身非质数的自然数的优化,那是不是可以对本身是质数的在做一次优化呢,我们可以使用 Math.sqrt(i) 代码示例:

public static void main(String[] args) {boolean isFlag = true;long start = System.currentTimeMillis();//获取系统当前累计毫秒数for (int i = 2; i < 100000; i++) {//优化二: 对本身是质数的自然数是有效的for (int j = 2; j <= Math.sqrt(i); j++) {if (i % j == 0) {isFlag = false;break; // 优化一 :满足条件跳出循环。只对本身非质数的自然数是有效的}}if (isFlag) {System.out.println(i);}isFlag = true;}long end = System.currentTimeMillis();//获取系统当前累计毫秒数System.out.println("所花费的时间为" + (end - start) + "毫秒");
}

所花费的时间为53毫秒。这就明显快了很多了

我们也可以做一下其他的优化,如 System.out.println(i) 也是比较消耗性能的,可以将代码注释,替换成累加count:

public static void main(String[] args) {boolean isFlag = true;int count = 0;long start = System.currentTimeMillis();//获取系统当前累计毫秒数for (int i = 2; i < 100000; i++) {//优化二: 对本身是质数的自然数是有效的for (int j = 2; j <= Math.sqrt(i); j++) {if (i % j == 0) {isFlag = false;break; // 优化一 :满足条件跳出循环。只对本身非质数的自然数是有效的}}if (isFlag) {count++;
//                System.out.println(i);}isFlag = true;}long end = System.currentTimeMillis();//获取系统当前累计毫秒数System.out.println("100000以内的质数个数为" + count + "个");System.out.println("所花费的时间为" + (end - start) + "毫秒");}

100000以内的质数个数为9592个
所花费的时间为12毫秒

这个时候赶脚自己还要学习的很多呀!!!

JAVA取质数(素数)算法优化相关推荐

  1. LeetCode一求素数算法优化的简单研究

    前言 1.求素数对于大多数人都比较简单,谁不知道啊.一个数n只存在1与自身能整除的数就为素数,并且编写代码也相对容易,很快就能写出. 2. 但是如果我现在要求优化求素数的算法呢?你能做到几步优化?从时 ...

  2. python反素数算法优化_合数

    python中判断一个数是不是质数2020-12-18 16:57:27 首先说明,内容结合了其他人的编程想法 和其他学习平台学习的思路,本人只是将解法记录下来方便自己之后查阅.由于本人学艺不精,如果 ...

  3. Java计算素数算法优化以及拓展

    package javaBlog;import java.util.ArrayList; import java.util.List;public class GetprimeNumber {/* * ...

  4. java算法优化_Java学习笔记---Java简单的代码算法优化(例)

    例:用一张1元纸币兑换1分.2分.5分硬币,要求兑换50枚硬币,求出所有组合. package mypackage01; public class demo { public static void ...

  5. 查找任意给定整数N范围内的所有质数(素数)及算法优化

    1.基本思路 质数的基本定义是除了1和其本身没有其他的约数.用编程实现就是,在循环中用一个变量i(从2开始自增至K-1)除K,如果i的某个值能被K整除就退出循环,那么这个数K不是质数.当i都增至K-1 ...

  6. c语言生成两位随机素数算法,[算法]费马小定理求质数的算法之Miller-Rabin算法,C语言实现 | 李大仁博客...

    今天讲点比较高级的算法,目的也很简单,求质数,但是应用一种新的算法Miller-Rabin算法,这是一种利用了概率和费马小定理的算法设计,有点玄乎吧,其实本人也是刚接触这种算法,这是一种纯数学的解法, ...

  7. python求素数算法_Python程序最多可计算n个质数(使用不同算法)

    python求素数算法 There are various methods through which we can calculate prime numbers upto n. 我们可以通过多种方 ...

  8. 用Java求质数(素数)等问题

    质数,又称素数,是指在大于1的自然数中,除了1和它本身以外不再有其他因数的自然数. 简单理解就是质数是一个大于1的自然数,除了1和它自身外,不能被其他自然数整除: 否则称为合数(规定1既不是质数也不是 ...

  9. 判断素数(质数)高效算法

    最近看到一篇高效的素数判断算法文章,但是文章中有些部分写的还不够完整清晰,所以在此详细记录一下此算法理解过程.(理解此算法前应先明白使用 sqrt(num) 为判断条件判断素数的方法) 此算法产生的原 ...

最新文章

  1. 康奈尔大学对博士生的四点要求
  2. 事业单位计算机专业知识试卷,计算机专业知识试题(事业单位计算机专业知识考试试卷).doc...
  3. java 中对多态的理解
  4. Java正则表达式校验工具类_【Java工具类】----正则表达式校验工具类
  5. ERP顾问的三层境界
  6. python下载安装教程2.7-Python2.7.6下载
  7. linux 分区表dd,dd复制分区后目标分区的大小变成原分区了
  8. mysql 为游标赋值_mysql 存储过程之游标
  9. 05.MyBtais两种取值符号以及输入参数和输出参数
  10. Oracle EBS 入门
  11. java JDBC操作MySQL数据库
  12. 新iPhone又被各个品牌玩坏了,这里的人个个都是人才,说话又好听…
  13. scrapy middlewares.py
  14. SSH关于公钥认证Permission denied的问题
  15. opencv基础--特征提取与配准(SIFT系列)
  16. Scrum Meeting day 2
  17. Lesson 3 上机练习题——继承
  18. OpenGL ES之3D模型加载和渲染
  19. pi启动configtool
  20. eplan窗口宏与符号宏是什么_电气设计||Eplan P8 宏功能的应用

热门文章

  1. Web 服务器-Apache详解
  2. mysql 7.4_CentOS 7.4 64位/ mysql
  3. python qq签到_Python开发qq批量登陆
  4. android notification 定时显示,Android编程使用Service实现Notification定时发送功能示例...
  5. 联想用u盘重装系统步骤_联想笔记本重装win10系统教程
  6. D2 日报 2019年6月11日
  7. 【大数据分析常用算法】1.二次排序
  8. 电商适用电子面单接口对接案例
  9. [转]WxEmojiView
  10. nginx 缓存动态内容 和使用自定义错误503