算法--数论

这里写目录标题

  • 质数(素数)
    • 定义
    • 判断是否为质数
      • 暴力写法,试除法
        • 基本思想
        • 具体写法
      • 优化
        • 基本思想(时间复杂度根号n)
        • 具体写法
    • 分解质因数
      • 分析题意
      • 暴力写法
        • 基本思想
        • 具体代码
      • 优化
        • 基本思想(时间复杂度小于等于根号n)
        • 具体代码
    • 筛质数(区别于判断质数,这个是筛选出来并保存,质数的数目较多)
      • 基本思想
      • 具体代码
      • 优化(埃氏算法)
        • 基本思想(时间复杂度约为n)
        • 具体代码
      • 优化2(线性筛法)
        • 基本思想
        • 具体代码
  • 约数
    • 求一个数的所有约数
      • 试除法
    • 约数个数
      • 基本思想
      • 具体题目+代码
        • 题目以及分析
        • 代码
    • 约数之和
      • 基本思想
      • 具体代码
    • 求最大公约数
      • 基本思想(欧几里得算法)
      • 具体代码

质数(素数)

定义

在这里插入图片描述

判断是否为质数

暴力写法,试除法

基本思想

从定义出发,判断是否为质数
1、小于2的数,统一返回false
2、遍历 i 从2到小于n(即除去1和n)
判断是否有n % i == 0 的,表示这中间有i可以整除,如果有,返回false

最后返回true

具体写法

在这里插入图片描述

优化

基本思想(时间复杂度根号n)

在这里插入图片描述
利用质数的性质,当d能被n整除时,n/d 也能被n整除,
所以,只需要判断从2到根号n有无能让d整除的数即可

具体写法

在这里插入图片描述
这里的 i 就是上面的d,循环 i 判断是否有数能让n整除,也就是上面的判断d是否能让n整除

分解质因数

分析题意

在这里插入图片描述
质因子分解,就是输出几组质数并输出他们对应的数量,他们乘积等于输入的数

暴力写法

基本思想

直接循环所有从2到等于n的数,如果能找到一个被n整除的 i ,那么 i 一定是一个质数,这里与上面判断质数的代码要区分开,
上面写到:
for循环里,if(n % i == 0) return false
因为上面是判断n是否为质数,跟 i 没有关系
而本题的重点不在n,而是他的因子 i,所以这里当可以整除时, i 一定是一个质数,这句话就不会与上面矛盾了

具体代码

在这里插入图片描述
纠正:int x 改为 int n
循环i从2到小于等于n,其中如果找到了一个i能被n整除,那么这个i一定是质数,他就是我们要找的质因子之一(具体原因见上方“基本思想”),之后循环计算 i 的次数即可
循环计算质数次数时:
首先定义一个计数器s=0;
之后,while循环,条件是n 还可以整除 i
条件成立,就更新n 为 n/i,(因为题设是多个质因子的乘积,所以要进行下一步判断的话,要先将已经判断出来的 i 除去)
之后计数器++
输出质子以及出现的次数

优化

基本思想(时间复杂度小于等于根号n)

在这里插入图片描述
利用性质:n中最多只包含一个大于根号n的质因子
证明:如果有两个大于跟好n的质因子,那么这两个相乘,一定大于n,不成立,所以该性质成立,我们可以利用这个性质进行优化

具体代码

在这里插入图片描述

将for循环的 i ,从2开始循环到 小于等于n/i
然后,其他的不变,在for循环结束之后,如果n>1(因为n在上面的过程中,不断的被除开,不断的变小,被除开的原因见上面“未优化时具体代码的解释”),那么这个n就是那个大于根号n的质因子,他的个数永远为1,因为只存在一个大于根号n的质因子

tip:puts(“”);可以输出一行回车
同时puts(“字符串”);可以输出字符串

筛质数(区别于判断质数,这个是筛选出来并保存,质数的数目较多)

基本思想

在这里插入图片描述
从2开始,删除后面2的倍数、删除3的倍数、4、5…
最后留下的都是质数,
因为假设p被留下了,那么就是前面2到p-1都没能把p删掉,也就是前面的倍数都没有p,所以p也就没有除去1和本身以外的因子,所以p一定是质数

具体代码

在这里插入图片描述
纠正:17行 primes【】= i
prime数组用来存放质数
cnt用来移动prime数组里的坐标,同时也在计数
st数组用来记录某个数是否被删掉了

首先从2到小于等于n遍历 i
之后 直接判断是否st[i]为假,如果是,那么放入prime数组中,并且cnt++
if之后,使用for循环对倍数进行删除:
初始化 j 为 i+i ; j <=n ; j += i
st[j]=true
初始化为 i 的2倍,之后递增条件是在 j 的基础上依次加 i,这样就可以找到 i 的所有倍数

优化(埃氏算法)

基本思想(时间复杂度约为n)

在这里插入图片描述
我们的目的是删掉合数,
任何一个合数都会被筛掉,因为质数的倍数包括所有的合数,任何一个合数都有一个质因子
所以我们只需要删除出来前面质数的倍数即可

具体代码

在这里插入图片描述
纠正:17行 primes【】= i
将for循环放入if里面即可

优化2(线性筛法)

基本思想

在这里插入图片描述
埃氏筛法:
我们的目的是删掉合数,
任何一个合数都会被筛掉,因为质数的倍数包括所有的合数,任何一个合数都有一个质因子
所以我们只需要删除出来前面质数的倍数即可

线性筛法的思路仍然是删掉质数的倍数 , 但是这种算法是根据每个最小质因子的倍数去筛,效率更高

具体代码

在这里插入图片描述
仍然是for循环 i 从2到小于等于 n
之后if不变
改变一下第二个for循环 :
j初始化为0 ;之后primes[j]<= n/i ;j++
然后标记st[primes[ j ] * i ]=true; (删除每个最小质因子的倍数)
之后加一个if (i % primes[ j ] == 0) break; (这一步可以保证primes[ j ]是 i 的最小质因子)

注意点:关于筛质数的三个算法中,只有该算法的第二个for循环不同于其他两个,前两个的第二个for循环都一样,只是位置不同,要特别注意

约数

求一个数的所有约数

试除法

在这里插入图片描述
注意返回值是一个vector容器

首先是for循环从1到小于等于n
if i能被n整除
那么这个i就是一个约数,加入到容器中
另外这里需要一个特判:如果 i != n / i ,就把n / i 加到容器中,(因为约数不同于质数,约数是成对出现的,当我们找到一个 i 之后,可以顺势将其成对的另一个也加入到容器,前提是 i != n / i ,保证是两个成对的约数不相同时才加进去)

约数个数

基本思想

在这里插入图片描述
对于一个数N,可以写成多项的多次相乘的形式,这样的话,约数个数就是各个指数各自加一之后相乘的结果
原因:因为约数也就是N的因子,当N写成上图这种形式的时候,随便去掉一个p的一个次幂,相当于提出来了一个p的一次,而剩下的部分,还是N的因子,也还是N的约数,而a1次方的话,有0到a1一共(a1+1)种提法,所以所有的提法排列组合的个数,就是约数的个数

具体题目+代码

题目以及分析

在这里插入图片描述
该题是一个n个整数乘积的原始数,所以,我们在求这个数的约数个数时,要先将乘积得到的结构进行分解,分解成指数相乘形式,具体我们可以先对每一个数进行分解,每个数分解出来指数形式之后,存入一个map里,这样依次进行下去,就可以得到一个个的底数和次幂组合,拿到这些组合,就可以计算约数个数或者约数之和
在这里插入图片描述

代码

在这里插入图片描述
首先,操作的目标放在每一个输入进来的数,依次对其进行分解,分解的方式采用质因子分解:(实际上与上面的质因子分解如出一辙):
对于n个循环,每输入一个x,
我们对其进行一个for循环,i 从2到 小于等于 x / i
for循环里while循环,如果有x % i ==0
更新x(去除掉 i 部分)
同时primes[ i ] ++,i 的map值就是以 i 为底的组合中的次幂部分
for循环之后,就是对那个大于根号x的质子的特判,将其加入到primes的map中

之后就是根据题设套不同的公式,这里是求约数的个数,带入约数的个数公式即可,如上图

tips:
在这里插入图片描述
typedef long long LL;
数据范围巨大的数会用到LL

10的9次方+7,表示为: 1e9+7

约数之和

基本思想

在这里插入图片描述

具体代码

在这里插入图片描述
核心代码与上面的一样,不同的是公式的计算
for循环里面使用迭代器
对于每一个prime,先取出来first 以及 second
然后计算出他的p的0+p的1+p的2+p的3+…:
while(a–)t = (t * p +1),这样的话就可以得到p的0+p的1+p的2+p的3+…,上图取mod,是为了在这里取一次,可以节省效率
之后将while得到的t,乘入res,并取模,即可

具体while中的公式效果见下图:
在这里插入图片描述

求最大公约数

基本思想(欧几里得算法)

在这里插入图片描述
重要的是上图第二行被框住的部分
a 和 b 的最大公约数,可以转化为求b 和 a mod b 的最大公约数

具体代码

在这里插入图片描述
一行的模版
直接返回 b ?gcd(b, a % b ) : a
当b不为0时,返回gcd(b , a % b),递归下去
当b等于0,返回a即可

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/362532.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

【GEE】基于GEE可视化和下载Landsat8 L2A数据(镶嵌、裁剪)

之前发过一篇使用GEE下载Landsat8的文章&#xff0c;然后有很多小伙伴私信我各种问题&#xff0c;如L1C、L2数据代码怎么修改&#xff0c;如何镶嵌&#xff0c;如何去云、 如何裁剪等一系列问题。正好快过年了&#xff0c;手头的事也没有多少了&#xff0c;所以这两天整理了一下…

解决PS图片打印不清楚(锐化)

解决PS图片打印不清楚&#xff08;锐化&#xff09; 操作如下&#xff1a;

Antd中使用Select框 在点出弹出下拉列表后 鼠标移到外面滚动会导致下拉框位置偏移

今天使用Select框的时候 由于页面可以滚动 出现了 在点出弹出下拉列表后 鼠标移到外面滚动会导致下拉框位置偏移的bug 如图 上下滚动外部页面会导致下拉框偏移 解决方案&#xff1a; Antd 官方文档 文档中Select框有一个元素 getPopupContainer 并且有一行小字提示 注意…

使用goland IDE编写go windows ui

最近突发奇想&#xff0c;想实现一款工作节奏的提示安排小闹钟。那首先解决的就是UI。本人擅长go语言。那go在windows ui的探索肯定有人做过了吧。一查还真有&#xff0c;通过知乎&#xff0c;csdn等查到目前支持最好的就是walk库了。那走起试试。 一、拷贝go代码 将官网例子…

miniReact<一>

一、工程化配置 1.1 目录结构 1.1.1 Multi-repo VS Mono-repo Multi-repo 每个库有自己独立的仓库&#xff0c;逻辑清晰&#xff0c;协同管理复杂 Mono-repo 很方便管理不同独立的库的生命周期&#xff0c;会有更高的操作复杂度 项目有很多包&#xff0c;同时管理多个不同的…

Java技术栈 —— Spring MVC 与 Spring Boot

参考文章或视频链接[1] Spring vs. Spring Boot vs. Spring MVC[2] Key Differences Between Spring vs Spring Boot vs Spring MVC

如何给图片压缩大小?3种方法任你选择!

如何给图片压缩大小&#xff1f;在日常生活中&#xff0c;将图片压缩可以带来很多便利。首先&#xff0c;对于需要在网络上分享或传输的图片&#xff0c;压缩可以大大减少文件大小&#xff0c;加快上传和下载速度。其次&#xff0c;还可以帮助他们节省空间&#xff0c;存放更多…

Flex布局,几行代码就可以实现瀑布流布局,代码简单,定制化强。

原理很简单&#xff0c;计算图片的宽高&#xff0c;再计算每列的使用高度&#xff0c;然后再将当前图片放置在列高最小的一列。其实这种方式使用什么方式布局都无所谓&#xff0c;我使用的是flexd布局。Flex的使用在这里就不讲解了&#xff0c;网上的教程一大堆。这里讲解使用V…

数据治理到底是什么?为什么要做数据治理?

数据治理的两个目标&#xff1a;一个是提质量&#xff0c;一个是控安全。通过业务流程优化&#xff0c;规范数据从产生、处理、使用到销毁的整个生命周期&#xff0c;使得数据在各阶段、各流程环节安全可控&#xff0c;合规使用。 数据治理治的是“数据”吗&#xff1f; 数据是…

springboot与springcloud之间的版本对应关系

https://start.spring.io/actuator/info 当然&#xff0c;你可以直接在&#xff1a; https://spring.io/projects/spring-cloud 上看文档查询&#xff0c; 不过&#xff0c;最后应该是调到这里的&#xff1a; https://github.com/spring-cloud/spring-cloud-release/wiki/Suppo…

2024年【中级消防设施操作员(考前冲刺)】找解析及中级消防设施操作员(考前冲刺)考试总结

题库来源&#xff1a;安全生产模拟考试一点通公众号小程序 2024年中级消防设施操作员&#xff08;考前冲刺&#xff09;找解析为正在备考中级消防设施操作员&#xff08;考前冲刺&#xff09;操作证的学员准备的理论考试专题&#xff0c;每个月更新的中级消防设施操作员&#…

git clone常见问题一览及解决方法

在使用Ubuntu下&#xff0c;终端运行git clone命令时会遇见许多问题&#xff0c;本文主要针对一些常见的问题进行整理。关于换源问题&#xff0c;推荐使用小鱼的一键换源。 1.git clone 速度过慢 1.1 魔法 这个方法不做过多赘述&#xff0c;ubuntu下个人使用发现体验良好&am…

国外知名的农业机器人公司

从高科技温室到云播种&#xff0c;农业机器人如何帮助农民填补劳动力短缺以及超市货架的短缺。 概要 “高科技农业”并不矛盾。当代农业经营更像是硅谷&#xff0c;而不是美国哥特式&#xff0c;拥有控制灌溉的应用程序、驾驶拖拉机的 GPS 系统和监控牲畜的带有 RFID 芯片的耳…

Kotlin 协程1:深入理解withContext

Kotlin 协程1&#xff1a;深入理解withContext 引言 在现代编程中&#xff0c;异步编程已经变得非常重要。在 Kotlin 中&#xff0c;协程提供了一种优雅和高效的方式来处理异步编程和并发。在这篇文章中&#xff0c;我们将深入探讨 Kotlin 协程中的一个重要函数&#xff1a;wi…

中科院国际预警期刊名单发布一周年,共8本期刊被剔除!

据官方消息称&#xff1a;2024年中科院《国际期刊预警名单》将于2024年1月更新&#xff0c;今天已经是2月1号了&#xff0c;距离去年的2023年版《国际期刊预警名单&#xff08;试行&#xff09;》发布已经一周年&#xff0c;在去年被列入预警名单的28本期刊中&#xff0c;截止目…

FPGA高端项目:Xilinx Artix7系列FPGA 多路视频缩放拼接 工程解决方案 提供4套工程源码+技术支持

目录 1、前言版本更新说明给读者的一封信FPGA就业高端项目培训计划免责声明 2、相关方案推荐我这里已有的FPGA图像缩放方案我已有的FPGA视频拼接叠加融合方案本方案的Xilinx Kintex7系列FPGA上的ov5640版本本方案的Xilinx Kintex7系列FPGA上的HDMI版本 3、设计思路框架设计框图…

黑马程序员前端web入门:新浪新闻

黑马程序员前端web入门&#xff1a;新浪新闻 几点学习到的&#xff1a; 设置li无圆点: list-style: none;设置a无下划线&#xff1a;text-decoration: none;a属于行内元素&#xff0c;高度hegiht不起作用&#xff0c;可以设置 display: block; 把它变成块元素。此时&#xff0c…

创新型海外网红合作模式:打破传统,解锁品牌推广新机会

随着社交媒体的普及和全球化的发展&#xff0c;海外网红营销已经成为品牌推广的重要渠道。然而&#xff0c;传统的合作模式往往局限于简单的赞助或广告投放&#xff0c;缺乏深度和创新。为了打破这一局限&#xff0c;品牌需要探索一些创新型的海外网红合作模式&#xff0c;以带…

【简便方法和积累】pytest 单元测试框架中便捷安装插件和执行问题

又来进步一点点~~~ 背景&#xff1a;之前写了两篇关于pytest单元测试框架的文章&#xff0c;本篇内容对之前的做一个补充 一、pytest插件&#xff1a; pytest 有非常多的插件&#xff0c;很方便&#xff0c;以下为插件举例&#xff1a; pytest&#xff0c;pytest-html&#x…

【算法】拦截导弹(线性DP)

题目 某国为了防御敌国的导弹袭击&#xff0c;发展出一种导弹拦截系统。 但是这种导弹拦截系统有一个缺陷&#xff1a;虽然它的第一发炮弹能够到达任意的高度&#xff0c;但是以后每一发炮弹都不能高于前一发的高度。 某天&#xff0c;雷达捕捉到敌国的导弹来袭。 由于该系…