素数筛——字如其名

【Python 百练成钢】Python语言解决素数筛选问题的几种方式【朴素素数筛、埃氏筛、欧拉筛】 如果数据规模较大就会很耗费时间。测试数据分别为新手筛 测试数据10^5 阶乘结果9592用时21.401952028274536s新手优化筛 测试数据10^6 阶乘结果78498用时3.4318480491638184s埃氏筛测试数据10^6 阶乘结果78498用时0.27430033683776855s测试数据10^7 阶乘结果664579用时2.836449384689331s欧拉筛测试数据10^6 阶乘结果78498 用时0.6881604194641113s。 阅读详情

问题引出

问题:请将1~10000中的所有素数打印出来。

解决此类问题有一个通用的办法——用一个神奇的筛子,将所有素数全部“筛”出来。

基本数学背景

任何合数都可以唯一分解成一组素数的积。例如:60 = 2 * 2 * 3 * 5

筛子种类

素数筛一般有两种:埃氏筛和欧拉筛。前者时间复杂度为O(nloglogn)(我也不知道为什么),后者时间复杂度为O(n)。

埃式筛

  • 核心思想

下列一串数中

2 3 4 5 6 7 8 9 10 11 12

2是素数,因此将2选出来放在一个专门装素数的数组中,并且将所有2的倍数的数全部“筛”掉。

2 3 4 5 6 7 8 9 10 11 12 (筛掉了4, 6, 8, 10, 12)

接下来,3并没有被“筛”掉,说明3是素数,将3选出来放在一个专门装素数的数组中,并且将所有3的倍数的数全部“筛”掉。

2 3 4 5 6 7 8 9 10 11 12(筛掉了9)

接下来,发现4已经被筛掉,直接进行下一步。

5没有被筛掉,说明5是素数,将5选出来放在一个专门装素数的数组中,并且将所有5的倍数的数全部“筛”掉。
.一直到最后一个数终止。这就是埃氏筛的思路。

  • 缺点

会出现重复筛选的过程,例如,10会被2筛掉,也会被5筛掉。12会被2筛掉,也会被3筛掉。

  • 代码如下
#include<iostream>
using namespace std;

const int N = 100010;
int pr[N], cnt;
bool st[N];

void GetPrimes(int n) {
    for (int i = 2; i < n; i++)
        if (!st[i]) {
            pr[cnt++] = i;
            for (int j = 1; i * j < n; j++)
                st[i * j] = true;
        }
}

int main() {
    int n;
    cin >> n;
    GetPrimes(n);
    for (int i = 0; i < cnt; i++)
        printf("%d ", pr[i]);
    return 0;
}

思维有点难度,以后再写

欧拉筛

#include<iostream>
using namespace std;

const int N = 100010;
int pr[N], cnt;
bool st[N];

void GetPrimes(int n) {
    for (int i = 2; i < n; i++) {
        if (!st[i]) pr[cnt++] = i;
        for (int j = 0; i * pr[j] < n; j++) {
            st[i * pr[j]] = true;
            if (i % pr[j] == 0) break;
        }
    }
}

int main() {
    int n;
    cin >> n;
    GetPrimes(n);
    for (int i = 0; i < cnt; i++)
        printf("%d ", pr[i]);
    return 0;
}

练习

输入2的每个质因数之和
输入3的每个质因数之和
。。。。。。
输入10000的每个质因数之和

测试丢包_电信IPRAN承载LTE业务丢包故障处理案例 银川 景旭阳电信IPRAN承载LTE业务丢包故障处理案例一.故障现象某地市IPRAN网络承载LTE基站业务,客户反馈近期丢包严重,基站侧ping侧核心网EPC丢包达到10%左右;且基站数量在10个左右,并分布在同一地区,需要IPRAN网络协助排查;随后查看了IPRAN网络;发现这些业务所在基站的PW-BFD历史告警存在频繁的UP/DOWN告警;综上信息展开故障处理,初步判断由于BFD频繁... 阅读详情

相关推荐

C#开发者必备:VSPD虚拟串口快速配置指南(附汉化教程)

本文为C#开发者提供了VSPD虚拟串口的快速配置与汉化教程。详细介绍了如何安装、汉化VSPD,并创建稳定的虚拟串口对,重点讲解了如何将其集成到C#开发工作流中,使用SerialPort类进行数据通信测试、协议模拟及故障排查,有效提升硬件通信开发的效率。

weixin_29224529的博客 258

素数筛(彻底理解)

一.什么是素数 长话短说:因数只有1和本身的正整数,(但素数不包含1). 比如 2 ,3,5,7… 二.如何判断一个数是素数 用1中的定理,也就是说,如果某个大于1的正整数与任何小于等于它的正整数的最大公因数都是1,则为素数 咳咳咳…扯远了,我们的重心不在这里,重点在下面: 三.什么是素数筛 首先,给你一个区间的正整数,让你求在这段区间内有哪些素数? 这里,我们就可以用“筛选的方法”筛去不是素数的正整数(也就是合数)剩下的就是素数了,但不同的筛法效率也是不一样的 1. 最直接的筛法 获取1到n以内的所有素

YSJ367635984的博客 2万+

AI自主网络攻击技术深度解析:从LLM驱动到防御体系升级

网络安全领域正经历从自动化脚本到智能自主攻击的范式转变。其核心原理在于将大型语言模型(LLM)与自动化渗透测试框架深度融合,构建具备环境感知、决策规划和自适应能力的攻击系统。这种技术的核心价值在于实现了从预设步骤到目标驱动的质变,能自主完成信息收集、漏洞利用、横向移动等复杂攻击链。在应用场景上,它不仅能极大提升高级持续性威胁(APT)的攻击效率,也对渗透测试和红队演练技术提出了新的要求。面对此类由AI驱动的自主攻击,传统的基于签名的防御体系已显不足,必须转向以行为分析和零信任为核心的整体纵深防御。本次曝光的

weixin_34254464的博客 606

素数筛入门

这篇博客主要将素数筛的内容,朴素算法是大部分人最容易想到的方法,而埃氏筛和欧拉筛则需要了解,其中缩短时间复杂度的一系列优化算法很值得去细细品味,因为在竞赛方面很有帮助。

m0_74352735的博客 2034

Windows11下QGIS 3.34.4安装Geo-SAM插件全流程(附RTX3060 CUDA12.0配置技巧)

本文详细介绍了在Windows 11系统中为QGIS 3.34.4安装和配置Geo-SAM插件的完整流程,特别针对RTX 3060显卡用户提供了CUDA 12.0与PyTorch环境的精准搭建方案。通过预编码与交互式分割两大核心步骤,该插件能显著提升遥感图像半自动标注的效率,降低硬件门槛,是地理信息处理领域融合AI技术的实用指南。

weixin_29089057的博客 296

STM32C8T6HAL库实战:MAX30102心率血氧检测与OLED多级菜单一体化方案

本文详细介绍了基于STM32C8T6和HAL库的MAX30102心率血氧检测与OLED多级菜单一体化方案。内容涵盖硬件连接、CubeMX工程配置、传感器驱动移植、数据滤波算法、OLED显示驱动以及高效的多级菜单系统设计,旨在提供一个稳定、实用且易于移植的嵌入式健康监测项目参考。

weixin_29256771的博客 397

素数//素数筛

枚举所有小于数,看是否它能整除其他自然数,但实际上只需要枚举根号次。 bool Is_prime(int n) { for(int i=1;i*i&lt;=n;++i) { if(n%i==0) return false; } return true; } •埃氏筛:做法其实很简单,首先将2到n范围内的整数写下来,其中2是最小的素数。将表中所有...

VUno)UKGzseI 1万+

Halcon与C#联合编程(一):使用S7协议实现机器视觉上位机与西门子PLC联动

本项目技术栈:C#基础,多线程,Halcon DirectShow,Halcon形状检测,Halcon QR码识别,西门子S7通讯协议,西门子PLC为核心的下位机及执行元件

虎鲸不是鱼 1万+

素数筛(埃氏筛、欧拉筛)

那么对于任意的i>2,当我们遍历到i时,则我们一定先遍历了[2,i-1]之间的所有数,若isprime[i]为false,则证明i不是[2,i-1]中任意素数的倍数,即i只能被1和它自身整除,所以i为素数。若x∈[2,i-1],则x*i一定已经被标记为合数了,因为在遍历到i之前,我们一定已经遍历过x了,若x的最小质因数为k,k*y==x,则x的i倍即k的i*y倍若小于n则一定已经被标记过了。那么问题来了,如果我给你一个数字n,让你判断有多少个小于n的素数,...

m0_54123999的博客 4861

Linux Kernel入门到精通系列讲解 - 总目录

在学习Linux Kernel之前,需要先准备开发环境,方便后续进行开发。可以根据自身情况,选择性阅读该章节。学习该章节之前,你应该了解一下网络概念,明白为什么要讲这些,才能更有方向的去理解学习。Linux ARM平台开发系列讲解(设备树篇) 4.1.1 设备树的原理详解。本项目完全开源,仅供学习使用,如需其他用途,请与本人联系。),本章节你可以学习到。摄像头V4L2子系统、Linux kernel常用的子系统等,ARM架构、RISCV架构、Uboot等。

DSMGUOGUO的博客 1万+

基于 Qt C++ 的战术通信终端

logMessage(QString("新客户端连接来自: %1:%2").arg(incomingTcpSocket->peerAddress().toString()).arg(incomingTcpSocket->peerPort()));logMessage(QString("服务器已启动,在 [%1]:%2 监听IPv6连接...").arg(ui->lineEditAddress->text()).arg(port));

寒寒豆豆软件公司的博客 78

素数与素数筛

由于费马小定理的逆定理并不正确,对于卡迈克尔数即满足费马小定理的逆定理但是不为素数的数,虽然卡迈克尔数很少,在1~100000000范围内的整数中,只有255个卡迈克尔数,但是已经使他的效果落后于Miller-Rabin和Solovay-Strassen素性检验。欧拉筛(Euler's Sieve),也称为改进的埃拉托斯特尼筛法(埃式筛),是一种优化过的素数筛法,用于找出一定范围内的所有素数。例如i=5,2*5,3*5,4*5已经在前面i=2,3,4,5的时候筛选过了。第1个检查的是2,他说第一个素数;

a111737289291的博客 1515

BEV和OCC学习-4:数据准备生成pkl文件(NuSences)

info[‘cam_instances’][‘CAM_XXX’][i][‘bbox_3d’]:长度为 7 的列表,以 (x, y, z, l, h, w, yaw) 的顺序表示实例的 3D 边界框。info[‘cam_instances’][‘CAM_XXX’][i][‘bbox’]:2D 边界框标注(3D 框投影的矩形框),顺序为 [x1, y1, x2, y2] 的列表。info[‘cam_instances’][‘CAM_XXX’][i][‘attr_label’]:实例的属性标签。

zfjBIT的专栏 1700

素数判定和素数筛

素数(Prime number)是指在大于1的自然数中,除了1和它本身以外不再有其他因数的数。素数的判定是数论中的一个重要问题。本文将回顾常用素数判定方法以及两种经典的素数筛法即埃拉托斯特尼(埃氏筛)和欧拉筛。

Reaearcher-Du 1247

SAP B1中文培訓教材_SDK

公司内部培训资料,对开发工具 ,DIAPI, UIAPI,Add-ON有详细解说

C# WinForm 基于DirectShow.dll编写的程序,可边预览边保存视频,音频和图片

基于微软的DirectShow.dll的二次开发1.自动识别连接的摄像头跟麦克风且可以对其进行选择(默认选中第一个)2.可录制wmv和avi两种格式的视频并且都带有音频,avi可以录制的分辨率和帧数进行选择,wmv默认进行了淸晰度优化如不喜欢可去除代码中有相关提示3.可在预览点开之后进行拍照,也可边录制视频边拍照4.添加了视频和音频的压缩功能(酌情使用)这次二次开发发现C#对DirectShow的相关信息太少,这次做完也不敢藏私共享出来,还望大家指正

算法篇——素数筛

埃氏筛、欧拉筛的讲解

lcx0128的博客 3119

Devexpress16.2.6破解工具

Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具

【总结】素数筛方法详解

    在讲素数筛方法之前,先了解相关知识点: 素数: 在大于1的自然数中,除了1和它本身以外不再有其他因数的数。 对于一个合数x,必有一个范围在2~√x 的因数。      素数筛方法主要有三种: 素数的判定(素数筛) 普通线性筛(埃氏筛法 / 埃拉托斯特尼筛 / Eratosthenes素数筛) 优...

360°顺滑 2145

ET2012新版免狗免安装绿色软件

ET2012新版免狗免安祖昂绿色软件。,新界面,新视觉,

筛素数 (埃氏筛和欧拉筛)

质数(素数)是指在大于 1 的自然数中,除了 1 和它本身以外不再有其他因数的自然数。—“素数百度百科。

2503_91005718的博客 698

【模板】线性筛素数(埃筛+欧筛)

本来想自己写一篇的,但是找埃筛的代码时找到了一篇不错的题解,修改了一点内容,原作者的洛谷ID为 dormantbs

Build 3713

素数的欧拉筛

合数必定能被分解为质因数//原因:假如有一个合数,那么它必定拥有因数,如果因数有一个为合数,那么该合数一定能继续分解为两个因数相乘,直到分解到不可以再分解为止.因此合数一定可以分解为一个比他小的质数乘一个比他小的数字.即分解到一个质数和一个比他小的数字相乘,那么如果我们在遍历数字时,(从2,3,4等等)去掉这个数字之前的质数的倍数,那么必定可以在遍历到合数之前筛掉该合数.在大于1的数的范围内,那么如果我们要找质数,那么只需要找到合数,然后将合数去掉,那么便只有质数.,分别表示查询的范围和查询的个数。

2301_80096362的博客 953

GO-素数筛

素数筛 文章目录素数筛1、素数2、Code 1、素数 质数是指在大于1的自然数中,除了1和它本身以外不再有其他因数的自然数 素数筛 a. 首先生成一个自然数序列 b. 为每一个素数构造一个筛子,过滤输入序列的是素数倍数的数, 并返回新的序列 素数筛虽然是一种优雅的并发程序结构, 但因为每个并发体处理任务的粒度太细微, 程序的整体性能不是理想。 对于细粒度的并发程序, CSP模型中固有的消息传递代价太高 2、Code package main import "fmt" // GenerateNatura

SinkRain 2万+

素数筛总结

素数筛1. 基本素数筛2. 线性筛3. 欧拉筛参考材料 1. 基本素数筛 2. 线性筛 3. 欧拉筛 参考材料

wodongx123的博客 874

C/C++ 素数筛 ACM算法

原始方法(试除法) 最原始的素数判断方法 思路很简单,就是暴力从 2 一直除到 n-1 能被整除就是合数,否则就是素数 Code: int isPrime(int n) { if(n==1)return 0; for(int i=2;i<n;i++) { if(n%i==0)return 0; } return 1; } 问题: 十分暴力,耗时过长,TLE 致死 原...

果光的博客 2984

素数筛模板

在判定素数的问题中,随着不断学习,里面的拓展性也在不断地增加。 问题:判定一个数是否为素数: 想都不想的方法: static boolean isprime(int value){ for(int i=2;i( 3)数组尾],6,9,12 * * 不是素数 4: [i=4]不是素数,跳过 5: . . . . . . . . . . . . 这个到除了前面几次的计算量多一点,到后面...

bigsai 3436

素数筛

素数晒素数定义素数判断1、朴素判断(遍历找因数)2、改进朴素判断(砍半遍历找因数)3、埃氏素数筛(构造素数表)4、欧拉筛 素数定义 质数是指在大于1的自然数中,除了1和它本身以外不再有其他因数的自然数。 素数判断 判断关键是找出它所有的因数。判断一个数m是素数还是合数可以有以下的方法。 1、朴素判断(遍历找因数) 排除,只看大于等于2的整数,其他都是非素数也非合数。 将2到m-1的数全部拿出来和...

weixin_44385465的博客 608

素数筛详解

素数筛合集 原始、暴力,时间复杂度O(n*sqrt(n)) bool isprime(int n){ int i; for (i = 2; i <= sqrt(n); i++) if (n % i == 0) return false; return true; } 一般筛法:时间复杂度O(nloglogn) const int maxn = 100; bool numbe...

Ember_Sky 1463

基础数论之素数筛【C++算法竞赛】

教学相长,回忆一下数论有什么作用

qq_58249029的博客 872
上一篇: 二分法
下一篇: 汇编写算法
晓龙coding
博客等级 码龄7年 211粉丝 60原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值