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()方法的执行.比如设置一个标志来 ...
随机推荐
- Linux网桥配置(用于大数据虚拟化)
理解 VMware里面有三个虚拟机,分别为RHEL8,RHEL7,Windows的虚拟机,只有一个物理网卡连接物理网络,现在三台虚拟机都需要直连到物理网络,此时无法访问物理网络,只能给一个虚拟机访问物 ...
- KingbaseES 绑定变量与游标共享
对于重复执行的SQL,需要使用绑定变量,避免SQL的重复解析.但是,并不是说使用了绑定变量,就一定能避免硬解析.具体可以参见:https://www.cnblogs.com/kingbase/p/16 ...
- java的数据类型分为两大类
java的数据类型分为两大类 基本类型(primitive type) 数据类型 整数类型 byte占一个字节范围:-128-127 short占两个字节范围:-32768-32767 int占四个字 ...
- vivo 全球商城:电商平台通用取货码设计
vivo官网商城开发团队 - Zhou Longjian 一.背景 随着O2O线上线下业务的不断扩展,电商平台也在逐步完善交易侧相关的产品功能.在最近的需求版本中,业务方为进一步提升用户的使用体验,规 ...
- 使用PBIS将Linux加入域
使用PBIS将Linux加入域 很多企业已经部署的微软的活动目录,为了方便管理,可以把Linux加入域.网上流传了很多把Linux加入域的方法,感觉比较复杂,并且似乎并没有真正的加入域.只是完成 ...
- SQL语句中过滤条件放在on和where子句中的区别和联系
摘要: 介绍在多表关联SQL语句中,过滤条件放在on和where子句中的区别--inner join中没区别,外连接就不一样. 综述 蚂蚁金服的一道SQL面试题如下:SQL语句中,过滤条件放在on ...
- ACL和NAT
1 ACL 1.1 ACL的作用 1).用来对数据包做访问控制(丢弃或者放弃) 2).结合其他协议,用来匹配范围 1.2 ACL的工作原理 当数据包从接口经过时,由于接口启用了ACL,此时路由器会对报 ...
- 优化过的containerd配置文件:config.toml
disabled_plugins = [] imports = [] oom_score = 0 plugin_dir = "" required_plugins = [] roo ...
- scheduler打印状态到日志
编辑脚本和目录 # 如下步骤每个proxysql节点都需要操作 [root@ss30 opt]# mkdir -p /opt/proxysql/log [root@ss30 opt]# vim /op ...
- kvm安装windows使用virtio驱动
Windows安装VirtIO驱动的两种方法 已经使用IDE方式来安装好系统 (1)安装完Windows后,创建一块临时的硬盘和网卡,将其驱动都设置为virtio模式添加到Windows中 (2) 添 ...