快速高效求素数|质数的方法—Java(模板)

devtools/2024/11/27 9:23:51/

判断素数|质数方法时间效率:线性筛法>埃氏筛法>试除法

在写算法题的时候,各种各样跟素数有关的题目非常常见,本文列出了三种常见的判断素数的方法

三种求素数方法的优缺点

一、试除法

试除法的基本思想是:判断一个数 x 是否为素数,需要检查从 2 到 sqrt(x)(即 x/i)之间的所有数。如果存在一个数 i 能整除 x,则 x 不是素数。我们只需要检查到 sqrt(x),因为如果 x = a * b,那么必定存在一个 a <= sqrt(x) 和一个 b >= sqrt(x),因此我们只需要检查较小的因子。

注意:sqrt()方法的计算速度较慢,并且为了防止溢出的问题,建议写成i<=x/i

java"> static boolean get(int x){if(x<2)return false;for(int i=2;i<=x/i;i++){if(x%i==0)return false;}return true;}

二、埃氏筛法

埃氏筛法:

假设所有数都为素数,从 2 开始。
对于每个素数 i,将其所有的倍数标记为合数(即不是素数)。
继续处理下一个未标记的数作为素数,直到遍历到 x。
最终,未被标记的数即为素数。

数据量大于10e7可能会超时

java">    static void get(int x){for(int i=2;i<=x;i++){if(!flag[i]){pri[cnt++]=i;for(int j=i+i;j<=x;j+=i)flag[j]=true;}}}

三、线性筛法

线性筛法是在埃氏筛法的基础上进行优化。

区别:

埃氏筛法:每次遍历素数时都需要标记所有倍数为合数。

线性筛法:只标记 i 与当前已有的素数相乘的倍数(不再处理重复倍数)。这样可以避免多次重复标记,提高效率。

筛法过程:

遍历每个数 i,如果 i 是素数(即 flag[i] == false),则将其加入素数列表。
对于每个素数 p,从 i * p 开始标记合数,直到 x。
注意标记时,若 i 已经被 p(一个较小的素数)整除,则不再继续与更大的素数进行标记,避免重复。

java">import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.StreamTokenizer;
import java.util.ArrayList;
import java.util.List;public class Main {static int N=1000010;static List<Integer> list=new ArrayList<>();static boolean flag[]=new boolean[N];public static void main(String[] args) throws IOException {Read sc=new Read();int n=sc.nextInt();get(n);System.out.println(list.size());}static void get(int n){for(int i=2;i<=n;i++){if(!flag[i])list.add(i);for(int j=0;list.get(j)<=n/i;j++){flag[list.get(j)*i]=true;if(i%list.get(j)==0)break;}}}
}class Read{StreamTokenizer st=new StreamTokenizer(new BufferedReader(new InputStreamReader(System.in)));public int nextInt() throws IOException {st.nextToken();return (int)st.nval;}
}


http://www.ppmy.cn/devtools/137355.html

相关文章

【算法一周目】滑动窗口(2)

目录 水果成篮 解题思路 代码实现 找到字符串中所有字母异位词 解题思路 代码实现 串联所有单词的子串 解题思路 代码实现 最小覆盖子串 解题思路 代码实现 水果成篮 题目链接&#xff1a;904. 水果成篮 题目描述&#xff1a; 你正在探访一家农场&#xff0c;农场…

【IEEE出版 | ISBN: 979-8-3315-0796-1 | 高录用稳检索】 2025神经网络与智能优化国际研讨会(NNIO 2025)

【IEEE出版 | ISBN: 979-8-3315-0796-1 | 高录用稳检索】 2025神经网络与智能优化国际研讨会&#xff08;NNIO 2025) 2025 Neural Networks and Intelligent Optimization 重要信息 大会时间&#xff1a;2025年1月10-12日 一轮截稿&#xff1a;2024年11月30日23:59 会议地…

从Full-Text Search全文检索到RAG检索增强

从Full-Text Search全文检索到RAG检索增强 时光飞逝&#xff0c;转眼间六年过去了&#xff0c;六年前铁蛋优化单表千万级数据查询性能的场景依然历历在目&#xff0c;铁蛋也从最开始做CRUD转行去了大数据平台开发&#xff0c;混迹包装开源的业务&#xff0c;机缘巧合下做了实时…

避坑ffmpeg直接获取视频fps不准确

最近在做视频相关的任务&#xff0c;调试代码发现一个非常坑的点&#xff0c;就是直接用ffmpeg获取fps是有很大误差的&#xff0c;如下&#xff1a; # GPT4o generated import ffmpegprobe ffmpeg.probe(video_path, v"error", select_streams"v:0", sho…

QT报错:error: allocation of incomplete type ‘Ui::‘解决办法

目录 步骤一&#xff1a;创建.ui文件&#xff1a; 步骤二&#xff1a;修改c类(这里假设类名为test) 1.在头文件中包含 UI 文件 2.在实现文件中初始化ui 3.连接ui空间&#xff08;比如设置信号槽&#xff09; 步骤三&#xff1a;更新.pro文件 总结&#xff1a; qt使用中&a…

IMX 平台UART驱动情景分析:read篇--从硬件驱动到行规程的全链路剖析

往期内容 本专栏往期内容&#xff1a;Uart子系统 UART串口硬件介绍深入理解TTY体系&#xff1a;设备节点与驱动程序框架详解Linux串口应用编程&#xff1a;从UART到GPS模块及字符设备驱动 解UART 子系统&#xff1a;Linux Kernel 4.9.88 中的核心结构体与设计详解IMX 平台UART驱…

Linux(Ubuntu)升级openssh至9.6版本

前言&#xff1a; 修复 Openssh 命令注入漏洞(CVE-2020-15778)、OpenSSH ssh-agent远程代码执行漏洞(CVE-2023-38408)、OpenSSH 安全漏洞(CVE-2021-41617)、OpenSSH 信息泄漏漏洞 (CVE-2023-51385)将Openssh升级至9.6p1即可。 升级 OpenSSH 版本需要谨慎&#xff0c;特别是生…

k8s删除网络组件错误

k8s集群删除calico网络组件重新部署flannel网络组件&#xff0c;再部署pod后出现报错不能分配ip地址 plugin type"calico" failed (add): error getting ClusterInformation: connection is unauthorized: Unauthorized 出现该问题是因为删除网络组件后&#xff0c;网…