CCF-GESP五级考级——初等数论,全网最精简的求最大公约数gcd和最小公倍数lcm方法(100%好使)

news2024/9/23 17:24:21

👑一、约数和因数的区别

        约数必须在整除的前提下才存在,而因数是从乘积的角度来提出的。如果数a与数b相乘的积是数ca\times bc的因数。
        1.约数只能对在整数范围内而言,而因数就不限于整数的范围。

举个栗子:2\times 8= 16。2和8是16的因数,也可以是16的约数。
另外一个栗子:0.9\times 8= 7.2,虽然可以说0.9X8是7.2的因数,却不能说0.9和8是7.2的约数。


        2.对于一个整数,凡能整除它的数,都是这个整数的约数。而因数只有在多个数字相乘等于n的时候,才能说

举个栗子:1、2、4、8、16都能整除16,因此,1、2、4、8、16也都是16的约数。

而当一个数被分解成两个或几个数相乘时,因数的个数就受到了限定。
另外一个栗子:2\times 6= 8。只能说2和8是16的因数,而不能说1、2、4、8、16都是16的因数,因为1\times 2\times 4\times 8\times 16的结果,并不等于16。

👑二、求最大公约数(gcd)

        最大公约数(Greatest Common Divisor)指两个或多个整数共有约数中最大的一个,一般称之为"gcd",是其英文单词小写的首字母缩写。

        a, b的最大公约数记为gcd(a, b), 其中需要满足{a\geqslant b\geqslant 0}的条件。

a=16 b=12
↓
分解a的约数集合:{1, 2, 4, 8, 16};
↓
分解b的约数集合:{1, 2, 3, 4, 6, 12};
↓
找到最大的公共约数,也就是①都存在于a和b约数集合中的②最大数字。
↓
最大公约数->4

        求最大公约数有多种方法,常见的有 质因数分解法、 短除法、 辗转相除法、 更相减损法。短除法如下图所示,它常常用于手算,面对程序题常见的大数无能为力,所以不过多介绍。

       “质因数分解法”和“更相减损法”速度较慢,且本文旨在精简,所以代码写一套最优秀的坤坤便可以了。所以咱们着重讲解“辗转相除法”,也就是广为人知的“欧几里得算法”。

欧几里得算法的演化🎈

        用gcd(a,b)表示a和b的最大公因数:有结论gcd(a,b)=gcd(a,ka+b)。

要证明这个原理很容易:如果p是a和ka+b的公约数,p整除a,也能整除ka+b.那么就必定要整除b,所以p又是a和b的公约数,从而证明他们的最大公约数也是相等的。推理如下

if gcd(a, ka+b) = p
↓
由于p是a的约数,那么 a % p == 0 , ka+b % p == 0
↓
当且仅当 ka % p == 0 并且 b % p == 0 的时候 (ka + b) % p 才成立
↓
所以{ka + b % p == 0}、{ka % p == 0 }、{b % p == 0} 

        基于上面的原理,就能实现我们的迭代相减法:

gcd(36,14)=gcd(2*14 + 8,14)=gcd(8, 14)=gcd(8, 8+6)=gcd(8, 6)=gcd(6+2, 6)=gcd(2, 6)=gcd(2, 3X2+0) = gcd(2, 0)

,而gcd(2,0)的最大公约数是2。

        0是所有整数的约数,因此 0 和任何整数的最大公约数都是这个整数本身。

 写代码🎈 

        那么如何使用C++代码实现欧几里得算法呢?

//input
a(int), b(int)

//algorithm
//和推理不一样的是,我们需要一直保持 a > b, 为了方便,取余的操作固定是a%b,所以需要保持a>b
if b < a:
    temp = b
    b = a 
    a = temp

//我们可以看到当b为0的时候我们才结束了推理,所以b=0是循环的终止条件
while b:
    //现在a > b了 先得到余数
    c = a % b 
    //让a = b, b = 余数,完美的交换的同时保持 a>b
    a = b 
    b = c      

//ouput
//最后b=0 a=最大公约数
gcd(a,b)->a

请同学们自行实现一下,之后可以对照一下下面的参考代码。

#include <iostream>
#include <algorithm>
using namespace std;
int main()
{
    int T;
    cin >> T;
    while(T--)
    {
        int a, b;
        cin >> a >> b;
        //a % b == 0, 则b就是最大公约数,可以提前结束循环。
        while(a % b)
        {
            int c = a % b;
            a = b;
            b = c;
        }
        cout << b << endl;
    }
}

         大家学到这里一定非常幸苦,如果每次遇到gcd的题目,大家都要写这么多代码肯定很麻烦,接下来我们学习递归的方法。

#include<iostream>
#include<algorithm>
using namespace std;
int gcd(int a, int b){  // 一般要求a>=0, b>0。若a=b=0,代码也正确,返回0
	return b? gcd(b, a%b):a;
}
int main(){
    int a , b;
    cin >> a >> b;
    cout<<gcd(a,b)<<endl;
    return 0;
}

         哇,核心代码居然一共才写了三行

① int gcd(int a, int b){  // 一般要求a>=0, b>0。若a=b=0,代码也正确,返回0
②	return b? gcd(b, a%b):a;
}
③ cout<<gcd(a,b)<<endl;

那么如何理解呢,这是一个三目运算符,如果b≠0,就返回gcd(b, a%b),如果b=0,就返回a。

举个例子:
gcd(16, 12),进入下一层递归->gcd(12, 4),进入下一层递归 -> gcd(4, 0),返回上一层递归a=4->gcd(12,4),返回a=4->gcd(16, 12),返回a=4。所以最终结果就是4。是不是很神奇很奇妙呢?

            大家学到这里幸苦啦,但其实大家都白学了,这是因为👇

 白学了🎈

#include<iostream>
#include<algorithm> //这个头文件内置了一个求最大公约数的函数__gcd(a,b)
using namespace std;
int main(){
    int a, b;
    cin>> a >> b;
    cout<<__gcd(a,b)<<endl; //直接调用就写完了,核心代码就这一行,一行更比三行短。
    return 0;
}

👑三、求最小公倍数

        记公式

        然后就做完了 

#include<iostream>
#include<algorithm>
using namespace std;
int main(){
    int a,b;
    cin>>a>>b;
    cout<<a*b/__gcd(a,b)<<endl;
    return 0;
}

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

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

相关文章

中仕公考:国考往年招录情况对比

2025年国考预计10月中旬启动&#xff0c;11月进行笔试。中仕为大家总结了往年的国考招录情况&#xff0c;希望能给大家一些参考。 2024年计划招录3.96万人。截止到考试结束&#xff0c;共有225.2万人参加了考试&#xff0c;参加考试人数与录用计划数之比约为57:1&#xff0c;2…

CSP-J 2023真题一轮

选择题 阅读题 第1题 第2题 第3题 完善程序 第1题 第2题 答案&#xff1a; 一、单选题 1-5 BDAAC 6-10 BCADA 11-15 ABBAD 二、阅读程序 1&#xff09; 16. √ 17. √ 18. ⅹ 19.A 20.B 2&#xff09; 21. √ 22. ⅹ 23. √ 24. D 25.B 26.D 3&#xff09; 27. √ 28. √ 29…

EasyCVR视频汇聚平台构建远程安防监控:5大亮点解析,助力安防无死角

随着科技的飞速发展&#xff0c;远程安防监控系统已经成为现代社会中不可或缺的一部分&#xff0c;无论是在小区、公共场所还是工业领域&#xff0c;安防监控都发挥着至关重要的作用。而EasyCVR作为一款功能强大的视频监控综合管理平台&#xff0c;其在构建远程安防监控系统方面…

谷歌浏览器下载文件被阻止怎么解除

在工作生活中&#xff0c;我们会使用谷歌浏览器下载各种各样的文件&#xff0c;不过偶尔会遇到文件下载被阻止的情况。为了解决这一问题&#xff0c;本文为大家分享了实用的措施建议&#xff0c;一起来了解一下吧。&#xff08;本文由https://chrome.cmrrs.com/站点的作者进行编…

python爬取豆瓣电影数据

目录 一、背景 二、分析网站 1、ajax请求 三、代码实现 1、导包 2、面向对象实现 3、发送请求 4、解析数据 5、保存数据 6、定义主函数 7、实例化对象运行主函数 8、运行效果 四、以下是全部完整代码 五、报错解决 1、数据库连接报错 2、数据插入报错 一、背景…

136 只出现一次的数字

解题思路&#xff1a; \qquad 这道题目明确要求了时间复杂度为O(N)&#xff0c;空间复杂度为O(1)&#xff0c;不然借助哈希表很容易能够在O(N)的空间复杂度下解决。特殊的要求只能特殊处理&#xff0c;解这道题只能记住异或这种较特殊的运算方式。 \qquad 异或是对二进制数进…

《深入探究 @SpringBootApplication 注解的内部原理》

《深入探究 SpringBootApplication 注解的内部原理》 SpringBootApplication注解涵盖了 Spring Boot 的包扫描原理、自动装配原理等众多重要原理。接下来&#xff0c;我们将对该注解展开深入且详尽的研究。而研究上述原理的关键&#xff0c;在于剖析SpringBootApplication内部…

网上商品订单转手系统bootpf

TOC springboot408网上商品订单转手系统bootpf 第1章 绪论 1.1选题动因 当前的网络技术&#xff0c;软件技术等都具备成熟的理论基础&#xff0c;市场上也出现各种技术开发的软件&#xff0c;这些软件都被用于各个领域&#xff0c;包括生活和工作的领域。随着电脑和笔记本的…

【SpringBoot】SpringBoot框架的整体环境搭建和使用(整合Mybatis,Druid,Junit4,PageHelper,logback等)

目录 1.介绍 1.1 配置文件 1.2 目录结构 2.基于SpringBoot的SpringMVC 4.整合Mybatis 5.整合Druid连接池 6.整合Junit4 7.整合Logback 8.整合PageHelper 9.SpringBoot整合Thymeleaf ​编辑 【附录】springboot的pom.xml 1.介绍 Spring框架的优点是方便解耦、简化开…

openEuler系统安装Visual Studio Code

openEuler系统安装Visual Studio Code 背景安装密钥和存储库更新包缓存并使用dnf安装包Fedora 22及以上版本旧版本使用yum 安装过程截图安装成功看桌面效果 背景 openEuler(openEuler-24.03-LTS)安装了麒麟UKUI桌面但是没有麒麟软件商店想安装Visual Studio Code 安装密钥和…

计算机毕业设计选什么题目好? springboot 大学志愿填报系统

✍✍计算机毕业编程指导师 ⭐⭐个人介绍&#xff1a;自己非常喜欢研究技术问题&#xff01;专业做Java、Python、微信小程序、安卓、大数据、爬虫、Golang、大屏等实战项目。 ⛽⛽实战项目&#xff1a;有源码或者技术上的问题欢迎在评论区一起讨论交流&#xff01; ⚡⚡ Java、…

东晟时尚服饰文化传承与发展研发中心成立

近期&#xff0c;东晟时尚创新科技&#xff08;北京&#xff09;有限公司宣布成立东晟时尚服饰文化传承与发展研发中心&#xff0c;此举标志着公司在促进中国传统文化与现代时尚产业结合方面迈出了关键步伐。 作为一家在时尚科技推广和设计研发应用服务领域具有战略眼光的企业&…

微信云开发云存储 下载全部文件

一、安装 首先按照这个按照好依赖&#xff0c;打开cmd 安装 | 云开发 CloudBase - 一站式后端云服务 npm i -g cloudbase/cli 安装可能遇到的问题 ‘tcb‘ 不是内部或外部命令&#xff0c;也不是可运行的程序或批处理文件。-CSDN博客 二、登录 在cmd输入 tcb login 三、…

导出运营数据Excel报表

文章目录 概要整体架构流程技术细节小结 概要 产品原型 在数据统计页面&#xff0c;有一个数据导出的按钮&#xff0c;点击该按钮时&#xff0c;其实就会下载一个文件。这个文件实际上是一个Excel形式的文件&#xff0c;文件中主要包含最近30日运营相关的数据。表格的形式已经…

C语言(16)——初识单链表

1.链表的概念及结构 概念&#xff1a;链表是⼀种物理存储结构上⾮连续、⾮顺序的存储结构&#xff0c;数据元素的逻辑顺序是通过链表中的指针链接次序实现的。 结构图&#xff1a; 补充说明&#xff1a; 1、链式机构在逻辑上是连续的&#xff0c;在物理结构上不⼀定连续 2、…

【网络】自定义(应用层)协议——序列化和反序列化

我们接着上一篇&#xff1a;http://t.csdnimg.cn/Xt18d 我们之前写的代码都是在应用层的&#xff0c;而TCP是在应用层下面一层的传输层 1.自定义协议&#xff08;应用层&#xff09; 1.1.应用层和传输层的关系 应用层和传输层的概述 应用层&#xff1a;位于网络协议的最高层…

Apollo9.0 PNC源码学习之Planning模块—— Lattice规划(四):纵向运动轨迹规划

参考文章: (1)Apollo6.0代码Lattice算法详解——Part5: 生成横纵向轨迹 (2)自动驾驶规划理论与实践Lattice算法详解 0 前言 纵向运动规划主要是车辆的速度规划,对应于车辆油门和刹车的控制 reference_line和reference_line_info的区别及联系:ReferenceLineInfo 结构中…

全网最最最详细Keepalive的详解

1 Keepalived简介 Keepalived是一款开源的、免费的高可用软件&#xff0c;广泛应用于互联网IT企业中&#xff0c;以其轻量级、配置简单、管理方便等特点受到青睐。以下是Keepalived的详细简介&#xff1a; 1.1 基本概念 定义&#xff1a;Keepalived是一个类似于Layer 3、4 &…

Nginx系列-负载均衡

文章目录 Nginx系列-负载均衡1. 负载均衡基础1.1 负载均衡定义1.2 Nginx负载均衡原理 2. 负载均衡策略2.1 轮询&#xff08;Round Robin&#xff09;2.2 加权轮询&#xff08;Weighted Round Robin&#xff09;2.3 IP哈希&#xff08;IP Hash&#xff09;2.4 最少连接&#xff…

JavaEE----Servlet过滤器

前言 在现代Web开发中&#xff0c;Servlet技术是Java EE&#xff08;Jakarta EE&#xff09;的核心部分。随着Web应用复杂性的增加&#xff0c;Servlet过滤器&#xff08;Filter&#xff09;提供了一种灵活的方法来对请求和响应进行处理 Servlet过滤器是一种特殊的Java对象&a…