Java判断质数/素数的三种方法
介绍
质数:在大于1的整数中,如果只包含1和本身这两个约数,就被称为质数(素数)
解法
解法一:暴力枚举
枚举从2 ~ N的每一个数
实际上不用枚举到N,只需要枚举到√N就行
注意:
- 不要使用
sqrt()函数,直接求√n,因为该函数运算较慢 - 注意数据溢出,
i * i <= n可能会溢出,推荐使用i <= n / i
public static boolean isPrime(int n) {
// 枚举到√n,注意溢出
for(int i = 2; i <= n / i; i++)
// 如果i可以整除n,说明n不是素数,直接return false
if(n % i == 0)
return false;
// 说明n是素数
return true;
}
解法二:埃氏筛法
public static boolean isPrime(int n){
int [] arr = new int[n+1];
// 1:质数 0:非质数
Arrays.fill(arr,1);
for(int i = 2; i <= n; i++){
if(arr[i] == 1){
// 将i的倍数去除掉
for(int j = i+i; j <= n; j += i){
arr[j] = 0;
}
}
}
return arr[n] == 1 ? true : false;
}
解法三:线性筛法
public static boolean isPrime3(int n){
// 质数集合
List<Integer> primes = new ArrayList<>();
int [] arr = new int[n+1];
// 1:质数 0:非质数
Arrays.fill(arr,1);
for(int i = 2; i <= n; i++){
if(arr[i] == 1)
primes.add(i); // 添加集合中
// 筛选,
for(int j = 0; j < primes.size() && primes.get(j) <= n / i; j++){
// 标记
arr[i*primes.get(j)] = 0;
// 保证每个合数只会被它的最小质因数筛去,减少冗余
if(i % primes.get(j) == 0)
break;
}
}
return arr[n] == 1 ? true : false;
}
集合可以换成数组,用一个变量来保存当前集合中的质数数量,相当于下标
全部代码
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
public class Prime{
public static void main(String[] args) {
System.out.println(isPrime(430348));
System.out.println(isPrime2(430348));
System.out.println(isPrime3(430348));
}
// 暴力枚举
public static boolean isPrime(int n) {
// 防止溢出
for(int i = 2; i <= n / i; i++)
if(n % i == 0)
return false;
return true;
}
// 埃氏筛法
public static boolean isPrime2(int n){
int [] arr = new int[n+1];
// 1:质数 0:非质数
Arrays.fill(arr,1);
for(int i = 2; i <= n; i++){
if(arr[i] == 1){
// 将i的倍数去除掉
for(int j = i+i; j <= n; j += i){
arr[j] = 0;
}
}
}
return arr[n] == 1 ? true : false;
}
// 线性筛法
public static boolean isPrime3(int n){
// 质数集合
List<Integer> primes = new ArrayList<>();
int [] arr = new int[n+1];
// 1:质数 0:非质数
Arrays.fill(arr,1);
for(int i = 2; i <= n; i++){
if(arr[i] == 1)
primes.add(i); // 添加集合中
// 筛选,
for(int j = 0; j < primes.size() && primes.get(j) <= n / i; j++){
// 标记
arr[i*primes.get(j)] = 0;
// 保证每个合数只会被它的最小质因数筛去,减少冗余
if(i % primes.get(j) == 0)
break;
}
}
return arr[n] == 1 ? true : false;
}
}
运行截图

Java判断质数/素数的三种方法的更多相关文章
- Java遍历List集合的三种方法
Java遍历List集合的三种方法 List<String> list = new ArrayList<String>(); list.add("aaa") ...
- C#中??和?分别是什么意思? 在ASP.NET开发中一些单词的标准缩写 C#SESSION丢失问题的解决办法 在C#中INTERFACE与ABSTRACT CLASS的区别 SQL命令语句小技巧 JQUERY判断CHECKBOX是否选中三种方法 JS中!=、==、!==、===的用法和区别 在对象比较中,对象相等和对象一致分别指的是什么?
C#中??和?分别是什么意思? 在C#中??和?分别是什么意思? 1. 可空类型修饰符(?):引用类型可以使用空引用表示一个不存在的值,而值类型通常不能表示为空.例如:string str=null; ...
- JAVA之线程同步的三种方法
最近接触到一个图片加载的项目,其中有声明到的线程池等资源需要在系统中线程共享,所以就去研究了一下线程同步的知识,总结了三种常用的线程同步的方法,特来与大家分享一下.这三种方法分别是:synchroni ...
- Java原来如此-遍历Map的三种方法
import java.util.HashMap; import java.util.Iterator; import java.util.Map; import java.util.Set; pub ...
- (转)JAVA 调用Web Service的三种方法
1.使用HttpClient用到的jar文件:commons-httpclient-3.1.jar方法:预先定义好Soap请求数据,可以借助于XMLSpy Professional软件来做这一步生成. ...
- Java实现ping功能的三种方法及Linux的区分
前大半部份转自:https://blog.csdn.net/futudeniaodan/article/details/52317650 检测设备的运行状态,有的是使用ping的方式来检测的.所以需要 ...
- 判断图连通的三种方法——dfs,bfs,并查集
Description 如果无向图G每对顶点v和w都有从v到w的路径,那么称无向图G是连通的.现在给定一张无向图,判断它是否是连通的. Input 第一行有2个整数n和m(0 < n,m < ...
- Java基础—实现多线程的三种方法
Java虚拟机(JVM,是运行所有Java程序的抽象计算机,是Java语言的运行环境)允许应用程序并发地运行多个线程.在Java语言中,多线程的实现一般有以下三种方法: 1.实现Runnable接口, ...
- Java经典案例之用三种方法求1~100以内素数之和
素数,不能被除了1和本身以外整除的数被称为素数.接下来我用三种方式求得1~100以内素数. 方式一 外层每循环一次,内层就计算出这个数有几个因子,我们都知道素数的因子只有两个,所以如果个数为2就加进总 ...
- Java中终止线程的三种方法
终止线程一般建议采用的方法是让线程自行结束,进入Dead(死亡)状态,就是执行完run()方法.即如果想要停止一个线程的执行,就要提供某种方式让线程能够自动结束run()方法的执行.比如设置一个标志来 ...
随机推荐
- django_day01
内容回顾 django处理浏览器的请求流程: 请求发送到wsgi wsgi封装了请求的相关数据(request) django去匹配路径 根据路径判断要执行哪个函数 执行函数 函数执行具体的业务逻辑 ...
- KingbaseES R6 集群repmgr.conf参数'recovery'测试案例(三)
案例三:测试'recovery = manual' 1.查看集群节点状态信息: [kingbase@node1 bin]$ ./repmgr cluster show ID | Name | Role ...
- KingbaseFlySync ddl变更流程
关键字: KingbaseFlySync.Linux.x86_64.mips64el.aarch64.Java 一.ddl变更流程 1. 停掉客户业务,保证没有新数据产生 确认Oracle数据库上所有 ...
- KingbaseES 查询计划剖析
概述:了解KingbaseES查询计划对于开发人员和数据库管理员来说都是一项关键技能.这可能是优化SQL查询的第一件事,也是验证优化的SQL查询是否确实实现期望结果的方式. 1.KingbaseES数 ...
- python脚本将json文件生成C语言结构体
1.引言 以前用过python脚本根据excel生成相关C语言代码,其实本质就是文件的读写,主要是逻辑问题,这次尝试将json文件生成C语言的结构体. 2.代码 这是一个json文件,生成这个结构体的 ...
- 群晖-使用docker套件部署Prometheus+Grafana
Docker 部署 Prometheus 说明: 先在群辉管理界面安装好docker套件,修改一下镜像源(更快一点) 所需容器如下 Prometheus Server(普罗米修斯监控主服务器 ) No ...
- torch.meshgrid
1:https://blog.csdn.net/weixin_39504171/article/details/106356977 2: https://pytorch.org/docs/stable ...
- Docker安装Redis并使用Another Redis Desktop Manager连接
Redis简单介绍 Redis全称是Remote DIctionary Service,即远程字典服务.Redis 是一个使用C语言编写的.开源的(遵守 BSD 协议).高性能的.支持网络.可基于内存 ...
- Solutions:Elastic workplace 搜索:随时随地搜索所有内容 (一)
- 一文入门Qt Quick
以下内容为本人的著作,如需要转载,请声明原文链接微信公众号「englyf」https://www.cnblogs.com/englyf/p/16733091.html 初识Qt Quick 很高兴可以 ...