数论_埃氏筛法(求区间内多少素数)

本文介绍了古希腊数学家埃拉托斯特尼的筛法,这是一种高效寻找素数的方法。通过该算法,可以快速筛选出小于特定数值的所有素数,并应用于计算指定区间内的素数数量。文章提供了算法原理、实现代码及应用实例。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

埃拉托斯特尼(公元前276—公元前194)


埃拉托斯特尼是古希腊著名的数学家、地理学家、天文学家。他先在亚历山大港学习,后又转至雅典。公元前236年,托勒密三世指定他为亚历山大图书馆的图书管理员和馆长。他跟阿基米德是好朋友。埃拉托斯特尼的主要贡献包括:

埃拉托斯特尼筛法:寻找素数的方法。

地理常数测量:日地间距的测量(现在称一个这样的距离为一个天文单位)、地月间距的测量、测量赤道与黄道之间的偏角、地球半径测量等。

精确地图绘制:当时只有托勒密等级的人物能绘出同等级的地图。

算法数学原理:
埃拉托斯特尼筛法是快速筛选素数的算法,在处理大量整数是否是素数时有较高的效率。

例:筛选小于n的整数并记录结果。

解:计算sqrt(n),∵对于任意的z<n,若z为合数,不妨设z=a*b,则必有min(a,b)<sqrt(n)

∴所有小于n的合数均可被小于sqrt(n)的整数整除

从2开始,依次去除小于n的整数中能被其整除的数,最后剩下的就是素数

int prime[maxn];
bool is_prime[maxn];//is_prime[i]是true表示i是素数
//返回n以内素数的个数
int sieve(int n)
{
    int p=0;
    for(int i=0;i<=n;i++) is_prime[i]=true;
    is_prime[0]=is_prime[1]=false;
    for(int i=2;i<=n;i++){
        if(is_prime[i]){
            prime[p++]=i;
            for(int j=2*i;j<=n;j+=i) is_prime[j]=false;
        }
    }
    return p;
}

  例题:洛谷 P1865  ,

codevs3223 素数密度

[a,b]的素数,只需要

[2,b√]
的素数表即可。这样我们可以筛出这些素数,然后用这些素数筛[a,b]。

注意,j=max(2ll,(l+i-1)/i)*i的意思:

(l+i-1)/i表示大于等于a的i的倍数的最小值。
2则是普遍的i的倍数的最小值,一定不能小于2。
再乘i,j就可以枚举[a,b]之间的合数了。

 

#include<cstdio>
#include<iostream>
#include<cstring>
#include<algorithm>
#include<cmath>
using namespace std;
const int SIZE=1000010;
bool vis[SIZE];
bool pri[SIZE];
typedef long long LL;
int main()
{
    LL l,r;
    scanf("%lld%lld",&l,&r);

    for(LL i=2;i<=sqrt(r);i++)
    {
        if(!vis[i])
        {
            for(LL j=i*i;j<=sqrt(r);j+=i) vis[j]=1;

            for(LL j=max(2ll,(l+i-1)/i)*i;j<=r;j+=i) pri[j-l]=1;  
        }
    }
    int ans=0;
    for(int i=0;i<=r-l;i++) if(!pri[i]) ans++;
    printf("%d",ans);

    return 0;
}

  

转载于:https://www.cnblogs.com/passion-sky/p/10087034.html

请提供几个符合以下范围的蓝桥杯STEMA试题 • 基本概念与结构:程序设计语言以及程序编译和运行的基本概念,头文件、命名空间、主函数;• 数据类型与变量:整型(int,long long)、布尔型(bool)、字符型(char)、实型(float,double)、变量和常量的定义与使用、基本数据类型转换;• 运算:赋值运算、算术运算、逻辑运算、关系运算、位运算;• 控制结构:顺序结构、分支结构、循环结构、流程图;• 数组:一维数组、二维数组及多维数组;• 字符与字符串:字符数组、字符串类、字符串常用函数及 ASCII 编码;• 指针:定义及使用;• 函数:定义和使用,变量的作用域,常用的库函数;• 结构体:结构体的定义、存储,结构体数组的定义、存储、遍历等;• 类与对象:定义和使用,构造函数,析构函数;• 进制及进制转换;• 初等数论:整除、因数、倍数、指数、质 () 数、合数等概念,判断质数、合数、约数方法,辗转相除法(欧几里得算法)最大公约数,氏筛与线性筛筛质数,同余定理、加乘原理、排列组合;• 算法:o 入门算法:枚举法、模拟法;o 排序算法:冒泡排序、选择排序、插入排序、计数排序;o 基础算法:贪心法、递推法、递归法、二分法;o 数值处理算法:高精度加法、高精度减法、高精度乘法、高精度除法;o 搜索算法:深度优先算法、广度优先算法;o 动态规划:一维动态规划、背包类型动态规划;o (通常仅限中高级考试)动态规划:区间类型动态规划、树型动态规划;• 数据结构:o 线性数据结构:单链表、双向链表、循环链表、栈、队列;o 树:二叉树、完全二叉树、满二叉树、哈夫曼树、二叉搜索树;o STL:vector、list、stack、queue、set、map 以及常用函数;o (通常仅限中高级考试)图:邻接矩阵、邻接表、深度优先遍历、广度优先遍历、泛洪算法。
最新发布
03-10
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值