算法通关村——数论问题

数论是一个很重要的学科,覆盖领域极广,小到小学的智力问题,大到世界顶级科学家都一直在研究相关问题,因此其难度跨度非常大。在程序设计里 ,也经常会出现数论的问题,但是,这些一般都是比较基本的数论问题,例如素数问题、幂、对数、阶乘、幂运算、初等数论、几何问题、组合数学等等。这些问题中,组合数学等适合在回溯里讲解。几何问题则过于繁琐, 不利于做题。本部分,我们暂时只以宿舍和合数的问题来讲解,后续找到合适的题目继续来补充。

关卡名

数论问题

我会了✔️

内容

1.理解素数和合数如何判断

✔️

2.理解埃式筛的原理和工作过程

✔️

 1 辗转相除法

辗转相除法又叫做欧几里得算法,是公元前 300 年左右的希腊数学家欧几里得在他的著作《几何原本》提出的。最大公约数(greatest common divisor,简写为gcd),是指几个数的共有的因数之中最大的一个,例如 8 和 12 的最大公因数是 4,记作 gcd(8,12)=4。辗转相除法最重要的规则是,若 r 是 a ÷ b 的余数, 则gcd(a,b) = gcd(b,r)。例如计算 gcd(546, 429):

由于 546=1(429)+117

429=3(117)+78

117=1(78)+39

78=2(39)

因此

gcd(546, 429)

=gcd(429, 117)

=gcd(117, 78)

=gcd(78, 39)

=39

该规则的证明我们不做过多解释,感兴趣的同学可以看一下如何证明辗转相除法(欧几里德算法)? - 知乎。我们只看基于该结论如何实现,循环实现代码如下:

int gcd(int a, int b) {// 循环实现int k = 0;do {k = a % b;// 得到余数a = b;// 根据辗转相除法,把被除数赋给除数b = k;// 余数赋给被除数} while (k != 0);return a;// 返回被除数}

2 素数和合数 

我们看一下素数和合数的问题。素数又称为质数,素数首先要满足大于等于2,并且除了1和它本身之外,不能被任何其他自然数整除。其他数都是合数。比较特殊的是1即非素数,也非合数。2是唯一的同时为偶数和素数的数字。
有了定义,自然第一个问题就是如何判断一个正整数是否为素数。题目要求:给定一个正整数n(n<10^9),判断它是否为素数。
基本的方式是从2开始依次与n取余测试,看看是否出现n%i==0的情况,如果出现了则说明当前的n能被i整除,所以就不是。理论上一直测试到n-1,假如都不是,那就是素数了。
而事实上不需要测试这么多,只要从2开始遍历一直到n^(1/2)就可以 ,不用执行到n-1。这个是有明确的数学证明的,我们不再赘述,如果不知道请回家问高中老师。所以实现代码就是:

boolean isPrime(int num) {int max = (int)Math.sqrt(num);for (int i = 2; i <= max; i++) {if (num % i == 0) {return false;}}return true;}

基于该基础,就可以造题了,例如LeetCode204 给定整数 n ,返回 所有小于非负整数 n 的质数的数量 。

示例1:

输入:n = 10

输出:4

解释:小于 10 的质数一共有 4 个, 它们是 2, 3, 5, 7 。

这个问题几乎就是将上面的代码再套一层就行了,直接遍历:

public int countPrimes(int n) {int cnt = 0;for (int i = 2; i < n; i++) {if (isPrime(i)) {cnt++;}}return cnt;
}

这个方法计算小的数据没有错,但是计算比较大的n仍然会超时,还是性能不够。我们下一节继续研究。

3 埃氏筛 

上面LeetCode204 的题找素数的方法虽然能解决问题,但是效率太低,能否有效率更高一些的方法呢?
解决这个题有一个有效的方法,叫做埃氏筛,后来又产生了线性筛, 奇数筛等改进的方法。
基本思想是如果 x是质数,那么大于 x 的 xy的倍数 2x. 3x… 一定不是质数,因此我们可以从这一点入手。如下图所示:

我们先选中数字2,2是素数,然后将2的倍数全部排除(在数组里将该位置标记为0就行了)。
接着我们选中数字3,3是素数,然后将3的倍数全部排除。
接着我们选择数字5,5是素数,然后将5的倍数全部排除。
接着我们选择 7,11,13一直到n,为什么 4 、6、8 、9 ...不会再选择了呢?因为我们已经在前面的步骤中,将其变成0了。所以实现代码如下:

public int countPrimes(int n) {int[] isPrime = new int[n];Arrays.fill(isPrime,1);int ans = 0;for(int i=2;i<n;i++){if(isPrime[i]==1){ans++;if((long)i * i<n){for(int j=i*i;i<n;j+=i){isPrime[j] = 0;}}}}return ans;
}

这个是典型的以空间换时间的算法,这种思想在解决一些问题的时候可以参考,例如下面的丑数这个题。

4.丑数问题 

这个是剑指offer中的题目,我们把只包含质因子 2、3 和 5 的数称作丑数(Ugly Number),求按从小到大的顺序的第 n 个丑数。

示例:

输入: n = 10

输出: 12

解释: 1, 2, 3, 4, 5, 6, 8, 9, 10, 12 是前 10 个丑数。

根据丑数的定义,0 和负整数一定不是丑数。
当 n>0 时,若 n 是丑数,则 n 可以写成 n = 2^a + 3^b + 5^c 的形式,其中 a,b,c 都是非负整数。特别地,当 a,b,c 都是 000 时,n=1。
为判断 n 是否满足上述形式,可以对 n 反复除以 2,3,5,直到 n 不再包含质因数 2,3,5。若剩下的数等于 1,则说明 n 不包含其他质因数,是丑数;否则,说明n包含其他质因数,不是丑数。
因此可以得到如下解答方式:

    public boolean isUgly(int n) {if (n <= 0) {return false;}int[] factors = {2, 3, 5};for (int factor : factors) {while (n % factor == 0) {n /= factor;}}return n == 1;}

本题也可以使用上面介绍的埃氏筛方式来解决 ,你可以思考一下如何做。 

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【@ConfigurationProperties注解的用处】

介绍 ConfigurationProperties 是 Spring 框架中的一个注解&#xff0c;用于将配置文件中的属性映射到 Java 对象的字段上。它的主要用途是简化配置文件与 Java 对象之间的映射过程&#xff0c;使得配置更加方便、可读&#xff0c;并提供类型安全的属性访问。 用途和特性 属性…

vmware ubuntu22 访问github

1.虚拟机选NAT模式。 2.firefox找到下图setting。 3.选第四个&#xff0c;填主机ip和局域网代理的端口号。 4. 此时你应该能访问github了。

vue+ts实现离线高德地图 内网离线高德地图

1、下载瓦片 我是用最简单的软件下载——MapDownloader 链接&#xff1a;https://pan.baidu.com/s/1Hz__HcA5QhtGmjLNezC_pQ 提取码&#xff1a;6lek 来源&#xff1a;https://blog.csdn.net/fuhanghang/article/details/131330034 2、部署私有化瓦片资源 这里也是用最简单的…

顺序表和链表面试题

文章目录 顺序表(1)原地移除数组中所有的元素val&#xff0c;要求时间复杂度为O(N)&#xff0c;空间复杂度为O(1)。(2)删除有序数组中的重复项(3)合并两个有序数组 链表(1)删除链表中等于给定值 val 的所有节点(2)反转一个单链表(3) 合并两个有序链表(4)链表的中间结点(5)链表中…

顶级资源!五个免费图标素材网站

图片太花哨了&#xff0c;纯文本太单调了&#xff1f;别忘了设计师的魔法武器——图标&#xff01;图标材料是UI设计师不可缺少的一部分。优秀的图标设计不仅可以提高界面美感&#xff0c;还可以提高用户的互动体验&#xff0c;帮助用户更好地了解应用程序的功能和信息。在本文…

动态类型语言与静态类型语言的对比与比较

编程语言可以根据类型系统和类型检查时机分为动态编程语言和静态编程语言两大类&#xff0c;它们在运行时的代码检查方式、变量类型的使用方式等方面有很大的区别。这一块你知道吗&#xff1f; 本文将为您详细讲解两种编程语言的优缺点&#xff0c;以及它们的应用场景。 动态编…

Innodb-ruby深入探索Innodb存储结构

达在之前已经分享过Innodb数据存储结构知识&#xff0c;但是都是基于理论原理知识理解&#xff0c;今天利用Innodb文件解析工具ruby进行探索Innodb真实的存储结构。 索引原理过程&#xff1a;【Mysql】 InnoDB引擎深入 - 数据页 | 聚集索引_innodb的聚集索引的数据插入_Surviv…

2952. 需要添加的硬币的最小数量(结论题)

力扣&#xff08;LeetCode&#xff09;官网 - 全球极客挚爱的技术成长平台 分析知&#xff1a;设指针值从1开始依次递增&#xff0c;每次将coins里的值累加起来看能否得到或者大于当前指针值 &#xff0c;否则就将该指针值累加起来&#xff0c;即需要添加的数 class Solution …

老师需要具备的能力

作为一名老师&#xff0c;需要具备许多能力&#xff0c;来有效地教授学生知识和技能。本文将从以下几个方面探讨老师所需具备的能力。 一、教学能力 教学是老师工作的核心&#xff0c;因此老师需要具备高超的教学能力。这包括了开展教学计划、教学设计、授课技巧和引导学生思考…

bootstrap中的图标元素可以免费使用

Available glyphsIncludes over 250 glyphs in font format from the Glyphicon Halflings set. Glyphicon 网址如下&#xff1a; Components Bootstrap

2024年天津财经大学珠江学院专升本专业课考试《经济学》考试大纲

天津财经大学珠江学院2024年高职升本科专业课考试《经济学》考试大纲 一、本大纲系天津财经大学珠江学院2024年高职升本科《经济学》课程考试大纲。所列考试范围出自郑健壮、王培才主编的教材《经济学基础&#xff08;第二版&#xff09;》&#xff0c;清华大学出版社&#xf…

线程控制.

线程已经成为调度的基本单位了&#xff0c;每一个线程都属于同一个地址空间中&#xff0c;所有的线程都属于同一个进程 换句话任何一个线程尝试调用geipid它应该是同一个pid 可是OS选择线程时&#xff0c;他怎么知道哪个线程是主线程&#xff1f;哪个是新线程&#xff1f;线程也…

C语言-字符串变量

字符串变量 char* s “Hello, world!”&#xff1b; s是一个指针&#xff0c;初始化为指向一个字符串常量 由于这个常量所在的地方&#xff0c;所以实际上s是const char* s&#xff0c;但是由于历史的原因&#xff0c;编译器接受不带const的写法但是试图对s所指的字符串做写…

CAD画图-模型和布局区别,视图命令MV使用(用于局部放大显示)

模型和布局的图像区别 模型的图像&#xff1a; 是我们常编辑的cad文件&#xff0c;我们可以对里面内容进行编辑和测量等操作 布局的图像&#xff1a;为了可以更好的看到每个部件的相对位置&#xff0c;但对于里面的点位的标注就不行了&#xff0c;但可以对图像中的某些部位进行…

软件项目功能测试框架

测试用例的编写需要按照一定的思路进行&#xff0c;而不是想到哪写到哪&#xff0c;一般测试机制成熟的公司都会有公司自己自定义的测试用例模板&#xff0c;以及一整套的测试流程关注点&#xff0c;当然我们自己在测试生涯中也应当积累一套自己的测试框架&#xff0c;所有功能…

二极管:TVS瞬态抑制二极管

一、什么是TVS二极管 TVS&#xff08;Transient Voltage Suppressors&#xff09;&#xff0c;即瞬态电压抑制器&#xff0c;又称雪崩击穿二极管。 TVS二极管的符号如下图所示 什么是雪崩击穿 雪崩击穿是有必要了解一下的&#xff0c;不然后面还有齐纳击穿&#xff0c;搞不…

第二十一章 网络通信

21.1 网络程序设计基础 网络程序设计编写的是与其他计算机进行通信的程序。 局域网与互联网 服务器是指提供信息的计算机或程序&#xff0c;客户机是指请求信息的计算机或程序。网络用于连接服务器与客户机&#xff0c;实现两者间的相互通信。 网络协议 网络协议规定了计算…

P4715 【深基16.例1】淘汰赛-仅思路

首先从题干要求入手&#xff0c;我们可以了解到题目要求是二进一&#xff0c;不难想到这是二叉树的题 再来&#xff0c;从题干可以知道&#xff0c;我们所采用的结构体除了需要有树的两个左右节点指针外&#xff0c;还需要两个变量用来储存“能力值”和“编号” 在这道题中&am…

竞赛选题 题目:基于深度学习的图像风格迁移 - [ 卷积神经网络 机器视觉 ]

文章目录 0 简介1 VGG网络2 风格迁移3 内容损失4 风格损失5 主代码实现6 迁移模型实现7 效果展示8 最后 0 简介 &#x1f525; 优质竞赛项目系列&#xff0c;今天要分享的是 基于深度学习卷积神经网络的花卉识别 该项目较为新颖&#xff0c;适合作为竞赛课题方向&#xff0c…

CoreDNS实战(三)-CoreDNS+ETCD实现DNS负载均衡

1 概述 DNS负载均衡简单来说就是通过一个域名绑定多个IP地址&#xff0c;当客户端访问域名时&#xff0c;DNS服务器将轮询返回其中一个IP&#xff0c;实现客户端分流的作用。 在K8s环境中CoreDNS作为容器服务的DNS服务器&#xff0c;那么就可以通过CoreDNS来实现DNS负载均衡&a…