【数论知识】1:和1-n中的所有质数有关的算法(朴素版+升级版)

1-n范围内的质数查找:埃拉托斯特尼筛法 质数是一个自然数,且除了1和它本身以外没有其他因数。换句话说,如果一个数大于1,且只有两个正因数(1和它本身),那么它就是一个质数。例如,2、3、5、7、11、13等都是质数。注意,1和0不是质数。根据质数的定义,质数p的倍数必然有其他因数(至少包括p本身),所以它们不可能是质数。因此,我们在使用埃拉托斯特尼筛法求质数时,对于每一个已知的质数p,都需要将所有p的倍数标记为非质数。例如,当p=2时,我们将所有2的倍数(即所有偶数)标记为非质数。 阅读详情

1.给定n,求出1~n中质数的个数

可以先记一下结论

是一个数学界推出来的,不知道为什么,记住就行
1-N里面有N/lnN个质数

朴素筛法(埃氏)

思想是用每个质数去筛除以它为约数的合数。
每个质数都要做一遍。

#include <iostream>
#include <algorithm>

using namespace std;
const int N = 1e6;
bool st[N];  //判断有没有被筛掉
int cnt = 0,primes[N];
void get_res(int x)
{
    for(int i = 2;i<=x;i++)
    {
        if(!st[i])
        {
        	primes[cnt ++ ] = i;
            for(int j = i+i;j<=x;j+=i)st[j] = true;
        }
    }
    cout<<cnt;
    return;
}




int main()
{
    int n;
    cin>>n;

    get_res(n);

    return 0;
}

线性筛法

中心思想是确保每个数在整个过程中都只被他最小的一个质数所筛除,这样就减少了很多无谓的计算量
在1e7的数据量下,线性筛法比埃氏算法快一倍。

#include <iostream>
#include <algorithm>

using namespace std;

const int N= 1000010;

int primes[N], cnt; //这里记录每一个质数
bool st[N];

void get_primes(int n)
{
    for (int i = 2; i <= n; i ++ )
    {
        if (!st[i]) primes[cnt ++ ] = i;
        for (int j = 0; primes[j] <= n / i; j ++ )  
        //一个合数n最多到n/(它的质数)的时候就会被筛除,记住就行
        {
            st[primes[j] * i] = true;
        //一个小于i的最小质数的数,也能确保它是primes[j] * i的最小质数
            if (i % primes[j] == 0) break;
        //找到i的最小质数,退出
        }
    }
}

int main()
{
    int n;
    cin >> n;

    get_primes(n);

    cout << cnt << endl;

    return 0;
}

2.判定一个数是否是质数

朴素无华版:

思路是枚举比这个数小的每个数,看取余是否为0

#include <iostream>
#include <algorithm>

using namespace std;

int n;

bool is_prime(int x)
{
    if(x == 1)return false;
    for(int i = 2;i<x;i++)
    {
        if(!(x%i)) return false;
    }
    return true;
}


但是这样基本在所有平台都会超时的,因为你没有get到这道题要考的点

优化版:

其实我们只需要枚举到根号n就可以确定是不是质数,一个数n如果是合数,那么它的约数有两种情况:
1.两个数都等于根号n,例如9 = 3*3,再枚举比3大的也没有意义了。
2.一个大于根号n,一个小于根号n,例如8 = 2 * 4,我们只需要找到2就可以确认它是合数。

因此同学A想到了改良的方法:

#include <iostream>
#include <algorithm>

using namespace std;

int n;

bool is_prime(int x)
{
    if(x == 1)return false;
    for(int i = 2;i<=sqrt(x);i++)
    {
        if(!(x%i)) return false;
    }
    return true;
}


但是这样的话,我们又用到了sqrt()来求n的根号,其实sqrt()这个函数也很费时间,所以并不是很好的选择。
这时候又有同学b提出了一种做法:

#include <iostream>
#include <algorithm>

using namespace std;

int n;

bool is_prime(int x)
{
    if(x == 1)return false;
    for(int i = 2;i*i<=x;i++)
    {
        if(!(x%i)) return false;
    }
    return true;
}

这样确实增加了速度,但依旧会显示超时,这是为什么呢?
因为有些时候数据很大,有可能i*i这一项在一次循环后直接大于int的范围了(1e9),这样在计算机里面就会变成一个负数,于是就会影响运行结果,甚至一直循环下去。

于是我们找到了最好的一种写法:
#include <iostream>
#include <algorithm>

using namespace std;

int n;

bool is_prime(int x)
{
    if(x == 1)return false;
    for(int i = 2;i <= x / i;i++)
    {
        if(!(x%i)) return false;
    }
    return true;
}

这样就万无一失了。

3.分解一个数的质因数:

与上一种类型的题类似,我们利用同样的方法:

#include <iostream>
#include <algorithm>

using namespace std;

void get_prime(int n)
{
    for(int i = 2; i<=n/i ; i++)
    {
        if(n%i == 0)
        {	
            int cnt = 0;      //记录每个质因子出现了多少此
            while(n % i == 0)	//循环对n进行操作
            {
                n/=i;
                cnt++;
            }
            cout<<i<<' '<<cnt<<endl;
        }
    }

    if(n>1)cout<<n<<' '<<1<<endl;

    cout<<endl;
}



int main()
{
    int n,x;
    cin>>n;
    while(n--){
        cin>>x;
        get_prime(x);
    }

    return 0;
}
浅谈算法竞赛中的初等数论1-----素数,素数筛,欧拉函数等(比较详细) 本文简介信息学竞赛中的某些素数知识,包含整除,素数,欧拉筛,gcd和lcm等 阅读详情

相关推荐

筛法——求n以内质数个数

朴素筛 埃氏筛 欧式筛 判断一个数是否为质数 区间筛法

zyqdxsomg 3664

求1到n之间的质数(素数)

质数又称素数。指整数在一个大于1的自然数中,除了1和此整数自身外,没法被其他自然数整除的数。换句话说,只有两个正因数(1和自己)的自然数即为素数。...

孤独的冥王星 1万+

C++N位质数(欧拉筛)

第五次实验 - 副本 编程题 7. N位质数 【问题描述】给定一个整数N(2 <= N <= 8),生成所有的具有下列特性的特殊的N位质数,即其前任意位都是质数。例如,7331即是这样一个4位的质数,因为7、73和733也都是质数。 【输入形式】输入一个整数N(2 <= N <= 8)。 【输出形式】输出有若干行,每行有一个整数,该整数有N位,而且其前任意位都是质数。并且: 1.要求输出所有符合题意的质数。 2.从小到大按顺序输出,且所有行上的数字不得重复。 【样例输入】2 【样例输

qjsssss的博客 2319

求范围内的质数的个数

首先上概念:质数又称。一个大于1的,除了1和它自身外,不能被其他自然数的数叫做质数;否则称为(规定1既不是质数也不是合数)。

充满焦虑的大学生 2543

求质数算法----层层递进的N种算法

题目1:给出一个正整数n,打印出所有从1~n的素数(即质数); 题目2:给出一个正整数n,打印出自然数中最小的n个素数(即质数); 先讨论问题1. 普通解法 傻瓜法 对于每个数m,逐个去除以小于它的数,看是否只有1能够整除。 优化 对于每个数m,逐个去除以小于等于sqrt(m)的数,看是否只有1能够整除。 进一步优化 对于每个数m,其实只需要对小于m的已经求出来的质数进行试除,直到sq...

end's coding life 1655

寻找N以内最大质数的算法详解

本文介绍了四种寻找不超过给定正整数N的最大质数的算法:1)朴素试除法(O(N√N)),适合小规模数据;2)优化试除法(排除2和3倍数,提升3倍效率);3)埃拉托斯特尼筛法(O(NloglogN)),适合中等规模;4)米勒-拉宾概率测试(O(klog³N)),适用于超大数据。通过性能对比和实际测试,文章建议根据数据规模选择算法:小数据用优化试除,中等数据用筛法,大数据用米勒-拉宾测试。文中还提供了分段筛法等优化策略,并附有Python实现代码。

学无止境 4549

【数论】 质数知识总结(质数判断、筛选、质因子分解、互质)

文章目录一.定义二.质数的判断二.质数的筛选 一.定义 质数,又称素数,若一个正整数无法被除了1和它自身以外的其它数整除,则称其为质数,否则为合数。特殊地,1既不是合数也不是质数 二.质数的判断 试除法: 检查所有可能成为n的因子的数,若没有找到因子,则证明这个数是一个质数 一种朴素的做法就是从2遍历到N-1观察有无N的因子,若没有则说明N为质数,依据的想法是N的因子必然在1~N的范围内 改进: 其实我们只要找到一个N的因子(除了1和它本身)就可以证明N是个合数。 定理:如果N是一个合数,则必然存在一个N的

Qiuker_jl的博客 4893

算法与数据结构 - 找出n内的所有质数(素数)?(暴力法、暴力优化法、埃筛法、欧拉筛法)

大家应该都会求n以内的所有质数,用的估计都是暴力法,但是当n非常大时,效率会大大降低,如果在笔试时还用暴力,估计会影响测试用例的通过率。这里记录一种最优的求法,时间复杂度可以达到O(n),下面我一步步来从暴力法进行优化:暴力法->暴力优化法->埃筛法->线性筛法>。坐稳了老铁~

weixin_43646592的博客 1281

算法中的基础数学知识(一)—初等数论

本人的LeetCode账号:魔术师的徒弟,欢迎关注获取每日一题题解,快来一起刷题呀~ 本人Gitee账号:路由器,欢迎关注获取博客内容源码。 文章目录一、知识框架二、质数1、质数的判定—试除法2、分解质因数—试除法3、筛质数1 朴素筛法2 优化1—埃氏筛法3 优化2—线性筛法4 leetcode204. 计数质数三、约数1、试除法求约数2、约数个数与约数之和3、最大公约数—欧几里得算法四、欧拉函数1 公式法求欧拉函数2 筛法求欧拉函数3 Acwing201.可见的点4 数论中的欧拉定理五、快速幂算法1 模.

CS_boy的博客 1482

编程求解1到n之间所有素数之和

编程求解1到n之间所有素数之和,输入只有一个n,输出为一个数。

采购订单定价策略 超详细

‘需求’字段里填写的是一个例程编号(例程是一段判断程序),如果我们在需求中维护了例程编号,那只有这个例程条件被满足时,这个条件表才会被系统自动读取。一部分的条件表只有在凭证项目满足一定的条件时才会被读取。 ‘排斥的’字段如果别勾中的话,那表明如果这个条件表被系统成功读取到数据后,系统将停止这个存取顺序的执行,否则,系统将继续执行下去。 注意:a、如果我们给某个条件类型设定了有效期的话,那我们必须给这个条件类型分配一个存取顺序。 b、不能给一个抬头条件分配存取顺序。 是...

竹大的博客 1万+

算法刷题-数论-质数的判定、分解质因数、筛质数

记录知识,形成体系

阿正的梦工坊 710

Emscripten安装(wasm编译)

5:配置对应环境变量--替换成自己对应的安装路径(2025最新的Emscripten工具链默认使用LLVM/WebAssembly标准工作流,java依赖已经移除了,所以以下java环境不配,需要使用java的手动添加即可---->emsdk install java-8-152-64bit。3:下载相应的依赖库---->emsdk install latest(我这里下的是最新的,如果有指定版本,把latest替换成版本号即可)6:测试是否成功---> emcc- v/em++ -v。

qq_31578301的博客 558

筛质数—(朴素筛法、埃氏筛法、欧拉筛法(线性筛法))

首先有一个最暴力的写法 int primes[N],cnt=0; bool st[N]={false}; void get_prime(int n) { for(int i=2;i<=n;i++) { if(!st[i]) primes[cnt++]=n; for(int j=i+i;j<=n;j+=i) st[j]=true; } } 1.埃拉托色尼筛法(the Sieve of Er

skill_Carney的博客 1460

《供应链金融风控模型设计:多维度数据整合与动态风险预警机制》

注:方案突出供应链金融「三流合一」(资金流、物流、信息流)的风控逻辑,通过多维度数据整合与动态预警,解决传统风控中中小企业信用评估难、链条风险传导监测滞后的问题。◦ 构建供应链拓扑图,计算「核心企业违约对上下游企业的影响系数」(如某电子厂商违约时,其前五大供应商的风险权重自动提升40%)• 区块链应用:将核心企业应付账款上链存证,防止「一票多融」欺诈(如某供应商用同一应收账款在多家银行融资)◦ 财务数据:核心企业审计报告、上下游企业纳税数据(增值税发票频次/金额)

2501_91651383的博客 1551

基于大模型的围术期谵妄防控系统研究报告

围术期谵妄是一种急性脑功能障碍综合征,通常发生在手术前后一段时间内。患者会出现意识障碍、注意力不集中、认知功能紊乱、睡眠 - 觉醒周期失调等症状,严重者甚至会出现幻觉、妄想和攻击行为 。这种病症不仅会给患者自身带来极大的痛苦,还会对其术后康复产生严重的负面影响。从患者角度来看,围术期谵妄会显著延长患者的住院时间,增加患者的医疗费用负担。有研究表明,发生谵妄的患者住院时间平均比未发生者延长 2 - 3 天。长时间的住院不仅会影响患者的生活质量,还可能导致患者错过最佳的康复时机,影响身体机能的恢复。同时,谵妄还

嵌入式毕设/课设资料清单(速查手册·文档模板·题库,持续更新)→ 见最新文章 1071

数论——质数筛

余虽愚,卒获有所闻。。。

2401_88036229的博客 470

AD(AltiumDesigner)封装导入allegro生成allegro封装

AD(AltiumDesigner)封装导入allegro生成allegro封装 貌似PCB的封装问题是一个无尽话题,为了简单我总是想找捷径(主要还是太懒了),因为也是近期才开始学习使用allegro进行PCB设计,在最近的一个设计中,很多器件封装allegro中都没有,一个一个画感觉很费时间,但是在AD(AltiumDesigner)的封装库中是有的,于是便想着AD的封装库能不能倒入到alleg...

yangh2560的博客 2万+

数学知识(一)——数论(质数、约数)

算法基础课-4.1 第四章 数学知识(一) 数论 共7题,知识点如下: 质数: 试除法判定质数、 分解质因数、 筛质数——埃氏筛法,线性筛法。 约数: 试除法求约数、 约数个数、 约数之和、 最大公约数

qq_44005993的博客 824

【docker】第10篇 Failed with result ‘exit-code和Start request repeated too quickly和Failed to start Docker

【docker】解决 Failed with result 'exit-code'和Start request repeated too quickly和Failed to start Docker。

Fanjufei的博客 6821

自助结账商品检测(Scanned Item Detection)——基于YOLOv8的RPC数据集实战

RPC数据集是由中国科学院自动化研究所发布的零售商品结账检测公开数据集,广泛用于自助结账和零售场景下的目标检测与识别。YOLOv8是YOLO系列最新版本,由Ultralytics推出,继承了YOLO家族的高效快速和高准确性,适用于实时检测场景。本文系统介绍了基于YOLOv8的RPC数据集自助结账商品检测方案,涵盖数据准备、训练、推理及UI界面设计。未来,可结合多模态感知、RFID融合技术,打造更加智能和稳定的自助结账系统。

YOLO 252

数学知识:质数相关讲解——质数判定,分解质因数及筛质数

本章详细讲了,质数的性质,质数的判定,分解质因数,质数筛,埃氏筛,线性筛

2401_86619696的博客 1214

使用PyTorch和TextCNN实现英文长文本诗歌文本分类

在这个过程中,我们了解了如何进行文本数据预处理、构建TextCNN模型,并进行训练与评估。首先,我们需要将文本文件加载到内存中,并将每个诗歌作为一个样本。然后,我们需要将每个样本转换为数字表示,这可以通过将词汇表中的每个词语映射到一个唯一的整数来实现。此外,我们还需要将每个样本的长度统一为固定值,以便于模型输入。通过这个示例,我们可以学习如何构建一个简单但有效的文本分类模型,并在具体的应用场景中进行训练和预测。该模型通过使用多个不同尺寸的卷积核来捕捉文本中的不同长度的信息,并通过最大池化操作提取关键特征。

loop_syntax648的博客 254

【数论】ACM数论基础知识总结

文章目录一.质数1.定义2.质数的判断3.质数的筛选4.质因子分解5.互质二.同余1.模运算 数论是数学的一个分支,研究的是整数的性质。本篇文章总结的是数论在ACM中的常见应用。 一.质数 1.定义 质数,又称素数,若一个正整数无法被除了1和它自身以外的其它数整除,则称其为质数,否则为合数。特殊地,1既不是合数也不是质数 2.质数的判断 给定一个数,判断是否为质数的方法: 试除法: 检查所有可能成为n的因子的数,若没有找到因子,则证明这个数是一个质数 一种朴素的做法就是从2遍历到N-1观察有无N的因子,

Qiuker_jl的博客 3268

SAP B1中文培訓教材_SDK

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

efm32 入门.pdf

本PDF共计22页,介绍的是操作驱动API,下载与否自己斟酌。

质数和约数

今天要讲解的是数论部分,包括求质数,筛质数,分解质因数,求约数,约数个数,约数之和,求最大公因数。

2301_81405396的博客 1578

华为的C语言编程规范.pdf

华为技术有限公司内部技术规范。本规范制定了编写C语言程序的基本原则、规则和建议。从代码的清晰、简洁、可测试、安全、程序效率、可移植各个方面对C语言编程作出了具体指导。

算法数论篇(质数)

算法数论

qq_59539549的博客 495

win10 跳过U8环境检测的IE WebControls.rar

win10 安装u8的时候 提示IE WebControls 不通过,这个工具可以欺骗u8的检查。 跳过U8环境检测的IE WebControls。提示导入失败后,重新检测通过。

上一篇: 【C++ STL】lower_bound()和upper_bound( )函数
下一篇: 根据时间复杂度为不同题目选择算法
Andy in boots
博客等级 码龄7年 73粉丝 69原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值