【蓝桥杯2025备赛】素数判断:从O(n^2)到O(n)学习之路

2024-04-19 00:28

本文主要是介绍【蓝桥杯2025备赛】素数判断:从O(n^2)到O(n)学习之路,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

素数判断:从O( n 2 n^2 n2)到O(n)学习之路

背景:每一个初学计算机的人肯定避免不了碰到素数,素数是什么,怎么判断?

素数的概念不难理解:素数即质数,指的是在大于1的自然数中,除了1和它本身不再有其他因数的自然数。

如何判断

刚进大学时,我最开始接触的就是最简单的那种,比较容易理解,但复杂度较高,容易超时

暴力写法

#include <iostream>
using namespace std;int primes[10000];
int main()
{int cnt = 0,n=1000;for (int i = 2; i < n; i++){int temp = 0;//假定是素数for (int j = 2; j < i; j++){if (i % j == 0) { temp = 1; break; }//只要i能整除j,那肯定不是质数,temp=1标记为合数}if (!temp)primes[cnt++] = i;}for (int i = 0; i < 20; i++)cout << primes[i] << " ";
}

时间复杂度:O( n 2 n^2 n2​​)

之后有看了网上的一些写法,学了些优化的方法

比如,我们判断到 n \sqrt n n 就可以结束了,为什么可以这样呢?

下面的这个图或许可以说明这一点

在这里插入图片描述

#include <iostream>
using namespace std;int primes[10000];
int main()
{int cnt = 0, n = 1000;for (int i = 2; i <n; i++){int temp = 0;//假定是素数if (i > 2 && i % 2 == 0)continue;//大于2的偶数肯定不是素数for (int j = 2; j*j<=i; j++)//这个地方可以写成j<=sqrt(i);但调用函数会慢一点//其次,写成乘法,而尽量不写j<=i/j;,乘法比除法更快{if (i % j == 0) { temp = 1; break; }//只要i能整除j,那肯定不是质数,temp=1标记为合数}if (!temp)primes[cnt++] = i;}for (int i = 0; i < 20; i++)cout << primes[i] << " ";
}

终极大法:欧拉线性筛

时间复杂度:O( n n n​)

关于这方面的解释,我找了下知乎大佬的解释,我自己大概明白了基本原理,但并不能很好的阐述它

废话不多说,上图!!!
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

img

const int N=100000;
int primes[N];//质数表,是质数的加入其中
bool st[N];//false表示素数,true为非素数
void get_primes(int N)//利用线性筛找到2~n中的质数
{int cnt=0;st[0]=true;st[1]=true;//0和1为非素数for(int i=0;i<=N;i++){if(!st[i])primes[cnt++]=i;//如果没被筛掉,是质数,假如质数表for(int j=0;i*primes[j]<=N;j++){st[i*primes[j]]=true;//用最小质因子去筛素数if(i%primes[j]==0)break;}}
}

OK,让我们来道题试试吧

X的因子链

输入正整数$ X$,求 X X X 的大于 11 的因子组成的满足任意前一项都能整除后一项的严格递增序列的最大长度,以及满足最大长度的序列的个数。

输入格式

输入包含多组数据,每组数据占一行,包含一个正整数表示 X X X

输出格式

对于每组数据,输出序列的最大长度以及满足最大长度的序列的个数。

每个结果占一行。

数据范围

1 ≤ X ≤ 2 20 1≤X≤2^{20} 1X220

输入样例:
2
3
4
10
100
输出样例:
1 1
1 1
2 1
2 2
4 6
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
const int N=(1<<20)+5;
int primes[N];bool st[N];
int minp[N];
void get_primes()//线性筛质数
{int cnt=0;for(int i=2;i<=N;i++){if(!st[i]){primes[cnt++]=i;minp[i]=i;}//记录最小质因数for(int j=0;primes[j]*i<=N;j++){st[primes[j]*i]=true;minp[primes[j]*i]=primes[j];//最小质因数if(i%primes[j]==0)break;}}
}
int main()
{   int x;get_primes();while(scanf("%d",&x)!=EOF){int k=0;int total=0;int sum[10]={0};//初始化数组while(x>1)//数的分解,用最小质因数去分解{  int t=minp[x];sum[k]=0;//我要用到的时候再重置为0,没用到的数据不为0没关系,因为遍历时数组只会遍历到k//而这k个数据在这里已经被重置后进行运算while(x%t==0){sum[k]++;total++;x/=t;}k++;}ll res=1;for(int i=2;i<=total;i++)res*=i;//总的阶乘for(int j=0;j<k;j++)for(int i=1;i<=sum[j];i++)res/=i;printf("%d %lld\n",total,res);memset(sum,0,sizeof(sum));//注意,这里开了memset会超时的,10^6的长度数组有100组数据就会运算10^8次了,容易超时}                          //当然,我们数组开到10然后重置是不会超时的,return 0;
}

这篇关于【蓝桥杯2025备赛】素数判断:从O(n^2)到O(n)学习之路的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/916184

相关文章

如何通过try-catch判断数据库唯一键字段是否重复

《如何通过try-catch判断数据库唯一键字段是否重复》在MyBatis+MySQL中,通过try-catch捕获唯一约束异常可避免重复数据查询,优点是减少数据库交互、提升并发安全,缺点是异常处理开... 目录1、原理2、怎么理解“异常走的是数据库错误路径,开销比普通逻辑分支稍高”?1. 普通逻辑分支 v

从基础到进阶详解Python条件判断的实用指南

《从基础到进阶详解Python条件判断的实用指南》本文将通过15个实战案例,带你大家掌握条件判断的核心技巧,并从基础语法到高级应用一网打尽,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起学习一... 目录​引言:条件判断为何如此重要一、基础语法:三行代码构建决策系统二、多条件分支:elif的魔法三、

Unity新手入门学习殿堂级知识详细讲解(图文)

《Unity新手入门学习殿堂级知识详细讲解(图文)》Unity是一款跨平台游戏引擎,支持2D/3D及VR/AR开发,核心功能模块包括图形、音频、物理等,通过可视化编辑器与脚本扩展实现开发,项目结构含A... 目录入门概述什么是 UnityUnity引擎基础认知编辑器核心操作Unity 编辑器项目模式分类工程

Python学习笔记之getattr和hasattr用法示例详解

《Python学习笔记之getattr和hasattr用法示例详解》在Python中,hasattr()、getattr()和setattr()是一组内置函数,用于对对象的属性进行操作和查询,这篇文章... 目录1.getattr用法详解1.1 基本作用1.2 示例1.3 原理2.hasattr用法详解2.

在Linux系统上连接GitHub的方法步骤(适用2025年)

《在Linux系统上连接GitHub的方法步骤(适用2025年)》在2025年,使用Linux系统连接GitHub的推荐方式是通过SSH(SecureShell)协议进行身份验证,这种方式不仅安全,还... 目录步骤一:检查并安装 Git步骤二:生成 SSH 密钥步骤三:将 SSH 公钥添加到 github

2025版mysql8.0.41 winx64 手动安装详细教程

《2025版mysql8.0.41winx64手动安装详细教程》本文指导Windows系统下MySQL安装配置,包含解压、设置环境变量、my.ini配置、初始化密码获取、服务安装与手动启动等步骤,... 目录一、下载安装包二、配置环境变量三、安装配置四、启动 mysql 服务,修改密码一、下载安装包安装地

Go语言中nil判断的注意事项(最新推荐)

《Go语言中nil判断的注意事项(最新推荐)》本文给大家介绍Go语言中nil判断的注意事项,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友参考下吧... 目录1.接口变量的特殊行为2.nil的合法类型3.nil值的实用行为4.自定义类型与nil5.反射判断nil6.函数返回的

python判断文件是否存在常用的几种方式

《python判断文件是否存在常用的几种方式》在Python中我们在读写文件之前,首先要做的事情就是判断文件是否存在,否则很容易发生错误的情况,:本文主要介绍python判断文件是否存在常用的几种... 目录1. 使用 os.path.exists()2. 使用 os.path.isfile()3. 使用

Go学习记录之runtime包深入解析

《Go学习记录之runtime包深入解析》Go语言runtime包管理运行时环境,涵盖goroutine调度、内存分配、垃圾回收、类型信息等核心功能,:本文主要介绍Go学习记录之runtime包的... 目录前言:一、runtime包内容学习1、作用:① Goroutine和并发控制:② 垃圾回收:③ 栈和

Go语言如何判断两张图片的相似度

《Go语言如何判断两张图片的相似度》这篇文章主要为大家详细介绍了Go语言如何中实现判断两张图片的相似度的两种方法,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起学习一下... 在介绍技术细节前,我们先来看看图片对比在哪些场景下可以用得到:图片去重:自动删除重复图片,为存储空间"瘦身"。想象你是一个