介绍

质数:在大于1的整数中,如果只包含1和本身这两个约数,就被称为质数(素数)

解法

解法一:暴力枚举

枚举从2 ~ N的每一个数
实际上不用枚举到N,只需要枚举到√N就行

注意:

  1. 不要使用sqrt()函数,直接求√n,因为该函数运算较慢
  2. 注意数据溢出,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判断质数/素数的三种方法的更多相关文章

  1. Java遍历List集合的三种方法

    Java遍历List集合的三种方法 List<String> list = new ArrayList<String>(); list.add("aaa") ...

  2. C#中??和?分别是什么意思? 在ASP.NET开发中一些单词的标准缩写 C#SESSION丢失问题的解决办法 在C#中INTERFACE与ABSTRACT CLASS的区别 SQL命令语句小技巧 JQUERY判断CHECKBOX是否选中三种方法 JS中!=、==、!==、===的用法和区别 在对象比较中,对象相等和对象一致分别指的是什么?

    C#中??和?分别是什么意思? 在C#中??和?分别是什么意思? 1. 可空类型修饰符(?):引用类型可以使用空引用表示一个不存在的值,而值类型通常不能表示为空.例如:string str=null; ...

  3. JAVA之线程同步的三种方法

    最近接触到一个图片加载的项目,其中有声明到的线程池等资源需要在系统中线程共享,所以就去研究了一下线程同步的知识,总结了三种常用的线程同步的方法,特来与大家分享一下.这三种方法分别是:synchroni ...

  4. Java原来如此-遍历Map的三种方法

    import java.util.HashMap; import java.util.Iterator; import java.util.Map; import java.util.Set; pub ...

  5. (转)JAVA 调用Web Service的三种方法

    1.使用HttpClient用到的jar文件:commons-httpclient-3.1.jar方法:预先定义好Soap请求数据,可以借助于XMLSpy Professional软件来做这一步生成. ...

  6. Java实现ping功能的三种方法及Linux的区分

    前大半部份转自:https://blog.csdn.net/futudeniaodan/article/details/52317650 检测设备的运行状态,有的是使用ping的方式来检测的.所以需要 ...

  7. 判断图连通的三种方法——dfs,bfs,并查集

    Description 如果无向图G每对顶点v和w都有从v到w的路径,那么称无向图G是连通的.现在给定一张无向图,判断它是否是连通的. Input 第一行有2个整数n和m(0 < n,m < ...

  8. Java基础—实现多线程的三种方法

    Java虚拟机(JVM,是运行所有Java程序的抽象计算机,是Java语言的运行环境)允许应用程序并发地运行多个线程.在Java语言中,多线程的实现一般有以下三种方法: 1.实现Runnable接口, ...

  9. Java经典案例之用三种方法求1~100以内素数之和

    素数,不能被除了1和本身以外整除的数被称为素数.接下来我用三种方式求得1~100以内素数. 方式一 外层每循环一次,内层就计算出这个数有几个因子,我们都知道素数的因子只有两个,所以如果个数为2就加进总 ...

  10. Java中终止线程的三种方法

    终止线程一般建议采用的方法是让线程自行结束,进入Dead(死亡)状态,就是执行完run()方法.即如果想要停止一个线程的执行,就要提供某种方式让线程能够自动结束run()方法的执行.比如设置一个标志来 ...

随机推荐

  1. 二 代理模式【Proxy Pattern】 来自CBF4LIFE 的设计模式

    什么是代理模式呢?我很忙,忙的没空理你,那你要找我呢就先找我的代理人吧,那代理人总要知道被代理人能做哪些事情不能做哪些事情吧,那就是两个人具备同一个接口,代理人虽然不能干活,但是被代理的人能干活呀. ...

  2. 源码(chan,map,GMP,mutex,context)

    目录 1.chan原理 1.1 chan底层数据结构 1.2 创建channel原理 1.3 写入channel原理 1.4 读channel原理 1.5 关闭channel原理 1.6 总结 2.m ...

  3. Vben Admin 源码学习:状态管理-角色权限

    前言 本文将对 Vue-Vben-Admin 角色权限的状态管理进行源码解读,耐心读完,相信您一定会有所收获! 更多系列文章详见专栏   Vben Admin 项目分析&实践 . 本文涉及到角 ...

  4. 三分钟,带你了解PLM

    PLM应用于单一地点或者多个地点的企业内部.以及在产品研发领域具有协作关系的企业之间的.支持产品全生命周期的信息的创建.管理.分发和应用的综合性的应用解决方案,能够集成与产品相关的流程.应用系统和信息 ...

  5. 关于mciSendString函数调用mp3音频的问题

    先说结论:这个函数一定要调用MP3文件,手动改MP3格式无效,一定要保证下载源是MP3格式文件.具体可参考:https://blog.csdn.net/m0_46436640/article/deta ...

  6. OKR之剑(理念篇)02—— OKR布道之旅

    作者:vivo互联网平台产品研发团队 1.我们是如何引入的 1.1.企业文化匹配 大概是在2013年底,一些创业者在硅谷深受OKR洗礼,并在自己的公司内小范围运用,以此OKR开始传入中国.而vivo初 ...

  7. Kubernetes 多租户:Pod 安全策略

    默认情况下,Kubernetes 允许创建一个有特权容器的 Pod,这些容器很可能会危机系统安全,而 Pod 安全策略(PSP)则通过确保请求者有权限按配置来创建 Pod,从而来保护集群免受特权 Po ...

  8. ProxySQL查看所有的全局变量及更新操作

    mysql> select * from global_variables; +--------------------------------------------------------- ...

  9. CentOS7使用yum方式安装Containerd

    # 安装需要的软件包, yum-util 提供yum-config-manager功能,另外两个是devicemapper驱动依赖的 yum install -y yum-utils device-m ...

  10. Beats:为 Beats => Logstash => Elasticsearch 架构创建 template 及 Dashboard

    文章转载自:https://elasticstack.blog.csdn.net/article/details/115341977 前一段时间有一个开发者私信我说自己的 Beats 连接到 Logs ...