介绍

质数:在大于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;
}
}

运行截图

最新文章

  1. 客户有两台windows服务器要做sql server双机切换
  2. C++ essentials 之 union
  3. 大学站防SQL注入代码(ASP版)
  4. python 多线程就这么简单
  5. Smarty模板技术学习(二)
  6. oracle 查看运行中sql
  7. POSIX字符类
  8. 分享Git的一些个人配置
  9. Linux企业级项目实践之网络爬虫(27)——多路IO复用
  10. Python正则匹配递归获得给出目录下的特定类型的文件小技巧
  11. 【转】ubuntu设置PATH----不错
  12. ./ . 和#!/bin/bash 辨析Linux如何选择当前执行脚本的shell
  13. First blogs start
  14. Lombok 使用小结
  15. enable multi-tenancy on openstack pike
  16. POI操作excle
  17. Mask_RCNN学习记录(matterport版本)
  18. [物理学与PDEs]第5章习题3 第二 Piola 应力张量的对称性
  19. 小程序仿QQ侧滑例子
  20. 写入mssql出现乱码

热门文章

  1. 十一章 Kubernetes的服务发现插件--coredns
  2. Elasticsearch-shell脚本实现定时删除指定时间以前索引
  3. saas 服务多语言 SDK
  4. Kubernetes 存储卷详解
  5. Elasticsearch:Elasticsearch HQ 介绍
  6. 第二章:视图层 - 9:动态生成CSV文件
  7. 使用Docker搭建Fluentd
  8. 2_Git
  9. 一文入门Qt Quick
  10. frp服务利用云主机docker服务实现Windows远程连接