素数筛法

算法之素数筛法 方法一 //判断是否是一个素数 int IsPrime(int a){ //0,1,负数都是非素数 if(a <= 1){ return 0; } //计算枚举上界,为防止double值带来的精度损失,所以采用根号值取整后再加1,即宁愿多枚举一个,也不愿少枚举一个数 int bound = (int)sqrt(a) + 1; for(int i = 2;i < b 阅读详情

素数筛法能很快的求出N以内的所有素数
原理:若一个数不是素数,则必存在一个小于它的素数为它的因子,所以在获得一个素数时,将它的所有倍数都标记为非素数,这样当遍历到一个数时,如果它没有被任何小于它的素数标记为非素数,那么它就一定是素数

方法一:

#define N 1000000
int a[N];   //素数标记为0,非素数标记为1
vector<int>p;
void Init(){
    memset(a,0,sizeof(a));
    for(int i=2;i<N;i++){   //N以内所有素数
        if(a[i]==0){    //i是素数
            p.push_back(i);
            for(int j=i+i;j<N;j+=i) //i的倍数标记为非素数
                a[j]=1;
        }
    }
}

上面那种方法仔细分析发现很多合数被反复筛选过,比如素数2会把6筛选一次,素数3又会把6筛选一次,这样重复筛选,影响效率

方法二:

#define N 1000000
int a[N];
vector<int>p;
void Init(){
    memset(a,0,sizeof(a));
    for(int i=2;i<N;i++){
        if(a[i]==0)p.push_back(i);//未被标记,是素数
        for(int j=0;j<p.size()&&i*p[j]<N;j++){  //用当前这p.size()-1个素数(从小到大)去筛选合数
            a[i*p[j]]=1;    //合数i*p[j]被筛选
            if(i%p[j]==0)break;//如果i是素数,那么会用上前p.size()-1个所有的素数,(当然先到i*p[j]>=N的话会提前结束)
                               //如果i是合数,那么会用上前面部分素数,遇到i的素因子就会跳出,
                               //这样每个合数就会只被标记一次
        }
    }
}

这种方法由于每个合数只被标记一次,所以复杂度相当于线性的

筛法求素数 ...   一般求素数都是暴力求解,这样效率不高,今天就总结一下筛法求素数,这是一种较高效的算法,具体如下: 用筛法求素数的基本思想是:把从1开始的、某一范围内的正整数从小到大顺序排列, 1不是素数,首先把它筛掉。剩下的数中选择最小的数是素数,然后去掉它的倍数。依次类推,直到筛子为空时结束。 用筛法求素数的基本思想是:把从1开始的、某一范围内的正整数从小到大顺序排列, 1不是素数,首先把它筛... 阅读详情

相关推荐

素数筛法(Eratosthenes筛法)

介绍 Eratosthenes筛法,又名埃氏筛法,对于求1~n区间内的素数,时间复杂度为n log n,对于106 以内的数比较合适,再超出此范围的就不建议用该方法了。 筛法的思想特别简单: 对于不超过n的每个非负整数p, 删除2p, 3p, 4p,…, 当处理完所有数之后, 还没有被删除的就是素数。 代码 void init() { int cnt=0; for(int i=0;...

无论多么困难,也要熬下去!!! 909

筛法(埃筛、线性筛)学习笔记

Eratothenes筛法、埃筛及时间、空间效率优化 Euler筛法、Euler筛法的应用(求欧拉函数、约数个数函数、约数和函数)

zhanxufeng的博客 4595

O(n)筛法求素数

讲述O(n)筛法求素数的经典论文 ---------- A Linear Sieve Algorithm for Finding Prime Numbers David Gries Cornell University Jayadev Misra University of Texas at Austin

三种质数筛(朴素、埃氏、欧拉)

三种质数筛(朴素、埃氏、欧拉) 目的: ​ 将 1 ~ N 中的质数都筛选出来。 方一、普通质数筛 思路分析: 从2到n进行遍历,对于遍历到的数如果没有被筛掉,就说明该数是素数。然后每次把遍历到的数i的倍数都筛去。为什么说这个方案可以筛出质数可行呢?因为对于一个数p,它如果没有被筛掉,就说明其不是前面2p-1的倍数,也就是说2p-1不存在p的约数,这不就是素数的定义! 时间复杂度分析:O(nlogn) 对于 i = 2,需要删除n / 2个数; 对于 i = 3, 需要删除 n / 3个数 …… 可以推出

Bananaaay的博客 4843

Nestjs框架: 集成 Prisma

NestJS官方文档提供了两种数据库相关的内容:Techniques下的数据库板块和Recipes下的具体数据库集成方案。本文以Prisma为例,演示了如何集成Prisma到NestJS项目中。首先创建NestJS项目并安装Prisma,配置MySQL数据库连接。通过Prisma CLI初始化项目、定义数据模型并生成迁移文件。接着创建Prisma模块和服务,配置Prisma客户端连接数据库。最后在控制器中注入PrismaService实现数据查询。整个过程包含了Docker启动MySQL、Prisma模型定

Wang的专栏 1293

vscode远程连接deepin出错:过程试图写入的管道不存在的解决方法

背景:昨天我用vscode使用ssh远程开发还处于正常状态,今天刚打开电脑,并启动deepin,再次使用vscode重新连接就出现异常。意思就是22号默认端口连接被拒绝,所以要先确定ssh是否连接。3.重新进入vscode里面,重新连接,如图成功连接。,查看port后面的端口号是不是22号。1.检查sshd是否启动。

qq_43573047的博客 2946

质数的两种筛法

由于该算法保证每个合数只会被它的最小质因子筛掉,而每个合数的最小质因子是唯一的,因此每个数只会被筛一次,故算法的时间复杂度为。再依次将下一个质数5、再下一个质数7、11的所有倍数筛掉,最终,没有被筛过的数即为 1~n 中所有的质数。轮(见下方质数定理),每一轮的循环长度依次是 n/2、n/3、n/5、n/7…从 2 开始,用每一个质数去筛掉它的倍数。但以上时间复杂度并非真实的时间复杂度,它只是一个粗略估计,真实的时间复杂度为。(2)质数定理:1 ~ n 中有。

weixin_45595437的博客 2462

STM32duino LSM6DSO驱动库:低功耗IMU工程化实践

惯性测量单元(IMU)是智能终端与工业设备实现运动感知的核心传感器,其性能关键在于数据精度、实时响应与系统功耗的协同优化。LSM6DSO作为集成加速度计与陀螺仪的六轴MEMS器件,依托片上有限状态机(FSM)和机器学习核心(MLC),支持自由落体检测、计步器、6D方向识别等硬件自治功能,显著降低主控CPU负载。在STM32平台下,通过深度耦合HAL/LL库、显式引脚管理、DMA加速SPI传输及EXTI中断协同,可实现亚毫秒级事件响应与微安级待机功耗。本文聚焦STM32duino生态中LSM6DSO驱动的工程

weixin_36304957的博客 551

筛法:普通筛、埃氏筛与欧拉筛

对于一个合数x,一定存在一个质数p≤x​且p∣x。先把结论考虑简单一点:合数x一定存在一个小于等于x​的因数。显然一个合数x可以被一对非1非x的整数pq表示为xpq则其中至少有一个整数小于x因为若pqx​,那么pqx。再进一步考虑这个结论:合数x一定存在一个小于等于x​的质因数。我们先假设每个合数不存在非1质因子,对于合数x,它一定有一个的小于等于x​的非1因数p而已经假设了每个合数不存在质因子,所以p为合数,

m0_72761451的博客 2006

CanMV K230实战:用MicroPython玩转AI视觉识别(附完整代码)

本文详细介绍了如何使用MicroPython在CanMV K230开发板上实现AI视觉识别,包括环境搭建、摄像头配置、模型部署及优化技巧。通过实战案例(如智能门禁和工业分拣机器人),展示如何快速开发低门槛的嵌入式AI应用,特别适合初学者和嵌入式开发者。

x8y9z0的博客 1142

ETL第八章无人售货机零售项目实践

ETL实战项目——无人售货机

m0_52058217的博客 4418

筛法

概述 诶氏筛法(埃拉托斯特尼筛法) 欧拉筛(线性筛) 使用欧拉筛筛选素数 使用欧拉筛计算欧拉函数 使用欧拉筛计算莫比乌斯函数 概述   筛法是一个在处理与素数有关的问题时经常使用到的方法。如果只需要对一个整数进行素性测试,那么通常使用O(n−−√)O(n)O(\sqrt{n})的算法就够了,但是如果需要对某个区间中的整数进行素性测试,那么就需要使用到筛法了。   下...

liu_jiangwen的博客 3243

多目标跟踪(MOT)中的卡尔曼滤波(Kalman filter)和匈牙利(Hungarian)算法详解

多目标跟踪(MOT)中的卡尔曼滤波(Kalman filter)和匈牙利(Hungarian)算法详解 1. 概览 在开始具体讨论卡尔曼滤波和匈牙利算法之前,首先我们来看一下基于检测的目标跟踪算法的大致流程。 2. 卡尔曼滤波(Kalman filter) 目标跟踪中使用的就是最基础的 Kalman filter 算法。这里也仅仅讨论最基础的 Kalman filter 算法。 卡尔曼滤波算法的过程很简单,如下图所示。最核心的两个步骤就是预测和更新(下图的 correct)。 在目标跟踪任务中,目标的

生命在于折腾! 2万+

三种素数筛法(普通筛法、埃氏筛法、欧拉筛法)

素数筛法 一般筛法: 一般筛法适用于单个元素的检验,就是简单地对于一个元素 n 从2至 sqrt(n)进行检验能否整除,有一个就不是素数。 代码如下: //原始筛选法->适用于单个元素的检验 bool isprime_A(int n) { for(int i = 2;i < sqrt(n);i++) { if(n % i == 0) { return false; } } return tru

hhyer的博客 8739

ESP32-C3蓝牙透传通信的BLE协议栈工程实践

蓝牙低功耗(BLE)透传是一种基于GATT服务模型的数据透明传输机制,其核心原理在于Peripheral设备通过广播建立连接,并在GATT Server层暴露可读写特征值实现双向数据通道。该技术具备低功耗、跨平台兼容性强、开发门槛适中等优势,广泛应用于智能硬件、工业传感器与嵌入式网关等场景。在实际工程中,透传稳定性高度依赖BLE协议栈的分层协同——Link Layer负责可靠连接建立,GATT Server则定义数据交互语义;而ESP32-C3的AT指令集正是对这两层能力的封装调度。本文聚焦BLE透传的关键

weixin_29859471的博客 122

Android 13.0 USB 麦克风音频采集优化:解决延时、杂音和无声问题

摘要:本文针对Android智能会议设备中USB麦克风存在的三大问题(录音延时、概率性杂音和无声)进行了深入分析和优化。通过预填充静音帧降低90%启动延时,分离采集/播放互斥锁消除杂音,采用持久化配置解决无声问题,并新增状态通知机制提升用户体验。优化后测试显示:录音延时从1200-2000ms降至100-200ms,故障率降至0%,CPU占用降低30%。该方案适用于各类USB音频设备和视频会议系统,为低延时音频采集提供了可靠解决方案。

ip0417的博客 229

素数筛法总结

素数筛法总结

ZhuRanCheng的博客 1451

OV9734 DATASHEET,完整规格书

OV9734完整规格书,包括电气参数,尺寸规格,寄存器配置表等

素数筛法:埃氏筛法与线性筛法

时间复杂度是Onloglogn。如果我们从小到大考虑每个数,然后同时把当前这个数的所有(比自己大的)倍数记为合数,那么运行结束的时候没有被标记的数就是素数了。例如:考虑 2 时, 我们把 4, 6, 8, 10, 12, 14, 16, 18 … 均标记为合数。考虑 3 时, 我们把 6, 9, 12, 15, 18, 21, 24, 27 … 均标记为合数。考虑 4 时, 我们把 8, 12, 16, 20, 24, 28, 32, 36 … 均标记为合数。

c的博客 1879

VB摄像头监控

该VB模块可对摄像头捕获的画面进行录像等,可在创建的窗口进行控制

ssm框架搭建

这个是一个在idea上成功跑起来的ssm框架项目,保存在这里方便以后使用直接下载

素数筛法 - 欧拉筛法

素数筛法 - 欧拉筛法 素数的筛法有几种,这次主要谈一下欧拉筛法 1.暴力求素数        时间复杂度 : O(n2) 稍微优化一下 :缩小数据范围从 n 优化到√n        时间复杂度 : 自然也就从 O(n2) 到 O(√n) 2.著名的埃式筛法        时间复杂度 : O(nloglogn) 而要谈的欧拉筛法则是在埃式筛法的基础上再次进行优化 3.欧拉筛法      ...

qq_43701555的博客 2266

jre9下载 jdk9

(Java SE Runtime Environment 9.0) 9.0u175 官方最新版 【x86|x64】

素数筛法:高效求解素数问题的利器

埃氏筛法是一种简单有效的素数筛选方法,通过不断标记合数来得到素数表,时间复杂度为 O (N log log N),空间复杂度为 O (N)。优化的埃氏筛法在埃氏筛法的基础上减少了不必要的计算,提高了效率,但时间复杂度仍为 O (N log log N)。线性筛法是最优化的筛法,保证每个合数只被标记一次,时间复杂度降低到 O (N),空间复杂度为 O (N)。

m0_57836225的博客 1423

素数筛法C++代码

素数筛法C++代码 这种素数筛法时间复杂度大约为O(n*sqrt(n)),略差于最优线性筛法的O(n),但是面对一般的OJ题目足够用了,而且简单易记。 使用素数筛法,输出0~Max之间的所有素数 #include &lt;iostream&gt; using namespace std; #define Max 100 //0~max_num之间的素数 int prim...

AlwaySimple的博客 4775

素数筛法求素数

素数筛类似于打表标记,预先处理掉非素数的数,即素数的倍数(任意非素数都可以由几个素数相乘得到),于是效率比暴力求解快得多。 埃氏筛法的效率为O(n loglog n),简单易懂,但是会重复标记,比如当i为2时,6会被标记掉,然而当i为3时,6又会被重复标记,这样的重复访问加大了时间复杂度,于是有了欧拉筛。 1 #include<iostream> 2 #include&l...

weixin_30662849的博客 237
上一篇: CF559A 三角形找规律
下一篇: 费波拉契通项公式变形
FightingForFinal
博客等级 码龄11年 24粉丝 100原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值