JAVA取质数(素数)算法优化
质数(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取质数(素数)算法优化相关推荐
- LeetCode一求素数算法优化的简单研究
前言 1.求素数对于大多数人都比较简单,谁不知道啊.一个数n只存在1与自身能整除的数就为素数,并且编写代码也相对容易,很快就能写出. 2. 但是如果我现在要求优化求素数的算法呢?你能做到几步优化?从时 ...
- python反素数算法优化_合数
python中判断一个数是不是质数2020-12-18 16:57:27 首先说明,内容结合了其他人的编程想法 和其他学习平台学习的思路,本人只是将解法记录下来方便自己之后查阅.由于本人学艺不精,如果 ...
- Java计算素数算法优化以及拓展
package javaBlog;import java.util.ArrayList; import java.util.List;public class GetprimeNumber {/* * ...
- java算法优化_Java学习笔记---Java简单的代码算法优化(例)
例:用一张1元纸币兑换1分.2分.5分硬币,要求兑换50枚硬币,求出所有组合. package mypackage01; public class demo { public static void ...
- 查找任意给定整数N范围内的所有质数(素数)及算法优化
1.基本思路 质数的基本定义是除了1和其本身没有其他的约数.用编程实现就是,在循环中用一个变量i(从2开始自增至K-1)除K,如果i的某个值能被K整除就退出循环,那么这个数K不是质数.当i都增至K-1 ...
- c语言生成两位随机素数算法,[算法]费马小定理求质数的算法之Miller-Rabin算法,C语言实现 | 李大仁博客...
今天讲点比较高级的算法,目的也很简单,求质数,但是应用一种新的算法Miller-Rabin算法,这是一种利用了概率和费马小定理的算法设计,有点玄乎吧,其实本人也是刚接触这种算法,这是一种纯数学的解法, ...
- python求素数算法_Python程序最多可计算n个质数(使用不同算法)
python求素数算法 There are various methods through which we can calculate prime numbers upto n. 我们可以通过多种方 ...
- 用Java求质数(素数)等问题
质数,又称素数,是指在大于1的自然数中,除了1和它本身以外不再有其他因数的自然数. 简单理解就是质数是一个大于1的自然数,除了1和它自身外,不能被其他自然数整除: 否则称为合数(规定1既不是质数也不是 ...
- 判断素数(质数)高效算法
最近看到一篇高效的素数判断算法文章,但是文章中有些部分写的还不够完整清晰,所以在此详细记录一下此算法理解过程.(理解此算法前应先明白使用 sqrt(num) 为判断条件判断素数的方法) 此算法产生的原 ...
最新文章
- 康奈尔大学对博士生的四点要求
- 事业单位计算机专业知识试卷,计算机专业知识试题(事业单位计算机专业知识考试试卷).doc...
- java 中对多态的理解
- Java正则表达式校验工具类_【Java工具类】----正则表达式校验工具类
- ERP顾问的三层境界
- python下载安装教程2.7-Python2.7.6下载
- linux 分区表dd,dd复制分区后目标分区的大小变成原分区了
- mysql 为游标赋值_mysql 存储过程之游标
- 05.MyBtais两种取值符号以及输入参数和输出参数
- Oracle EBS 入门
- java JDBC操作MySQL数据库
- 新iPhone又被各个品牌玩坏了,这里的人个个都是人才,说话又好听…
- scrapy middlewares.py
- SSH关于公钥认证Permission denied的问题
- opencv基础--特征提取与配准(SIFT系列)
- Scrum Meeting day 2
- Lesson 3 上机练习题——继承
- OpenGL ES之3D模型加载和渲染
- pi启动configtool
- eplan窗口宏与符号宏是什么_电气设计||Eplan P8 宏功能的应用
热门文章
- Web 服务器-Apache详解
- mysql 7.4_CentOS 7.4 64位/ mysql
- python qq签到_Python开发qq批量登陆
- android notification 定时显示,Android编程使用Service实现Notification定时发送功能示例...
- 联想用u盘重装系统步骤_联想笔记本重装win10系统教程
- D2 日报 2019年6月11日
- 【大数据分析常用算法】1.二次排序
- 电商适用电子面单接口对接案例
- [转]WxEmojiView
- nginx 缓存动态内容 和使用自定义错误503