最大公约数的四种方法

求最大公约数的四种算法 一. 题目分析 如果有一个自然数a能被自然数b整除,则称a为b的倍数,b为a的约数。几个自然数公有的约数,叫做这几个自然数的公约数。公约数中最大的一个公约数,称为这几个自然数的最大公约数。 根据约数的定义可知,某个数的所有约数一定不大于这个数本身,几个自然数的最大公约数也一定不大于其中任何一个数。所以当要求任意两个正整数的最大公约数,即是求出一个不大于其中两数中的任何一个,但又能同时整除两个整数的... 阅读详情

前言

求两数的最大公约数,一共有四种方法:暴力穷举法、更相减损法、辗转相除法、stein 算法,小女不才,花了几天的时间终于把这几种方法全部弄明白,现在就把它们全部分享出来。

首先,假设被求的两个数为 x、y,且 x > y。最大公约数 d = gcd (x , y)

1.暴力穷举法

正如名字所说,暴击穷举法就是简单粗暴地把 1~ y(前面已经假设 x > y)都列出来分别判断是否为 x、y 的公约数,然后再找到其中最大的一个。

暴力穷举法最大的特点就是简单直接、很容易理解,但是计算比较繁琐。

2.辗转相除法

辗转相除法是由古希腊数学家欧几里得在其著作《The Elements》中提出的,所以辗转相除法又名欧几里得算法。

步骤

假设要用辗转相除法求 36 和 24 的最大公约数,则要经历以下步骤:

36 ÷ 24 = 1 …… 12
24 ÷ 12 = 2 …… 0
12 为 36 和 24 的最大公约数

即

先用 x 除以 y
若余数为 0 则 y 为两数的最大公约数;若余数不为零,则令 x = y,y = 余数,重复步骤 1 直到余数为 0,此时的 y 为两数的最大公约数。

原理

相信从上面的阐述中,大家应该可以发现,辗转相除法依赖于一个定理:

两个整数的最大公约数等于其中较小的那个数和两数取模的最大公约数。

即:gcd (x , y) = gcd (y , x % y ) ,其中 x > y。

证明:

设 d = gcd (x , y);
则 x % d = 0 , y % d = 0 ;
则设 x = a * d , y = b * d ;
余数 r = x % y = (a * d) % (b * d) = d * (a % b);
所以 r % d = 0 ;
即 (x % y) % d = 0;
所以 gcd (x , y) = gcd (y , x % y )

3.更相减损法

更相减损法出自《九章算术》,其原理其实与辗转相除法一样,只是辗转相除法将的是相除取余,而更相减损法讲的是相减取差。

步骤

下面先看实例:(还是求36和24的最大公约数)

36 - 24 = 12
24 - 12 = 12
12 是 36 和 24 的最大公约数

即:

x - y = r
若 r = 0 ,则 x = y ,最大公约数为它本身;若 r ≠ 0,则令 x = y 和 r 中较大的一个数 , y = 剩下的另一个数,重复步骤 1 直到 r = 0,此时的 x = y ,即为最大公约数。

原理

从上面的阐述中,大家应该也能发现,更相减损法的原理依赖于下式:

gcd (x , y) = gcd (y , x % y ) ,其中 x > y。

证明:

d = gcd (x , y);
则 x % d = 0 , y % d = 0;
设 x = a *d , y = b * d;
则 r = x - y = a * d - b * d = d * (a - b);
所以 r % d = 0;
即 (x - y) % d = 0;
所以 gcd (x , y) = gcd (y , x - y);

比较

这里我们可以将更相减损法和辗转相除法进行比较:

将上面两个实例中的式子稍稍变形:
辗转相除法 36 = 24 + 12 ; 24 = 12 * 2
更相减损法 36 = 24 + 12 : 24 = 12 + 12

可以看到,两种方法的本质并无太大差别,从代码上看,两种方法也十分相似。只是当比较的两数差值比较大时,可能要进行多次减法才能达到一次除法的效果。

我们可以分别用以上两种方法计算一下 1997 和 615 的最大公约数,看看哪个计算次数更少。

辗转相除法:
在这里插入图片描述

更相减损法:
在这里插入图片描述

我们可以看到,当两数差值比较大时,辗转相除法计算的次数明显比更相减损法少。

4.stein算法

stein 算法就是那个我看了很久才看明白的算法……

比较

网络上很多人把 stein 算法与辗转相除法相比较。因为在 stein 算法之前,人们更常用的是辗转相除法,但是辗转相除法虽然相较暴力穷举法和更相减损法更高效,但是辗转相除法也有它的弊端。

简单地说就是当要计算的两个数很大很大很大很大很大很大的时候,除法运算就变得十分复杂,消耗很多时间,这时候一种不需要除法取模的 stein 算法就应运而生了。

之所以把 stein 算法放在更相减损法之后,是因为 stein 算法和更相减损法有相似之处。

在《九章算术》中,更相减损法的思想是:

可半者半之,不可半者,副置分母、子之数,以少减多,更相减损,求其等也。以等数约之。

简单地说就是能折半(除以2)的就折半,不能折半就相减,直到减数与差相等为止。

而 stein 算法则要利用移位和相减来实现求最大公约数。
在这里插入图片描述

其实 stein 算法在常规的计算中并不占优势,但是由于按位运算相对除法和取模运算更简便,所以当所求的数很大很大很大很大的时候,stein 算法就相对更简单啦~

当然,我们在对常规的数字求最大公约数的时候,还是推荐使用辗转相除法和更相减损法。

运算符
首先我们要先把stein 运算中涉及到的相关运算符进行简单介绍。

Ps:以下这些运算符在《【手把手带你入门】初识C语言》一文中的操作符一节进行了介绍,这里仅根据需要进行简单介绍,需了解详情请点击文章名字跳转。

&
这里 & 的作用就是利用 x & 1 来判断 x 的奇偶性。

如上图,因为 &(相与)是只要有0则为0,所以我们可以得到

偶数 & 1 = 0 ;
奇数 & 1 = 1 ;

移位操作符
(<<)左移和(>>)右移是C语言中的移位操作符,在这里,我们求的是两个数的最大公约数,我们计算的数都是正整数。

以实际的数 6 为例子:

6 的二进制数是……… 0110 (暂时只写出4位)
6<<1 即往左移1位变为1100
转换为十进制数是 12,而 12 = 6 * 2;
6 >>1 即往右移1位变为0011
转换为十进制数是 3,而 3 = 6 / 2;

那如果是 5 呢?

5 的二进制数是……… 0101 (暂时只写出4位)
5<<1 即往左移1位变为1010
转换为十进制数是 10,而 10 = 5 * 2;
5 >>1 即往右移1位变为0010
转换为十进制数是 2,而 2 = 5 / 2 …… 1;

所以这里我们可以简单地把 <<1 理解为乘 2、>>1 位理解为除 2;x << = a 即为使 x 乘 2a。

原理

弄明白移位之后,我们再来看 stein 算法的基本原理:

gcd (kx , ky) = k * gcd (x , y) ;

上面这个式子大家应该都能看的明白,所以这里就把证明省略啦

步骤

下面我们以20、30为例用 stein 算法求自大公约数:

20、30 均为偶数,20 ÷ 2 = 10,30 ÷ 2 = 15;
10 为偶数、15 为奇数,10 ÷ 2 = 5;
5、15 均为奇数,15 - 5 = 10;
10 为偶数、5 为奇数,10 ÷ 2 = 5;
剩下两数均为 5
则 5 * 2 = 10 是 20 和 30 的最大公约数

stein 算法的步骤:

若两个数都是偶数,则都除 >>1,记录次数;若两数为一奇一偶,则偶数 >>1 ;若两数均为奇数,则相减。
将得到的数重复执行步骤 1 直到得到的两个数相同。
若步骤 1 中两数都曾经 >>1,记录的次数为 n,则步骤 2 中得到的数再乘2n(<<n)即为两数的最大公约数。

求最大公约数 最大公因数 语言实现输出一个整数的最大公约数(因数),四种算法实现 求最大公约数 c语言实现输出一个整数的最大公约数(因数),四种算法实现 阅读详情

相关推荐

在 C 语言中,求最大公约数(GCD,Greatest Common Divisor)的常见的四种方法(附带源代码)

在 C 语言中,求最大公约数(GCD,Greatest Common Divisor)的常见方法有三种:辗转相除法、更相减损法和辗转相减法。以下是这四种方法的简单实现:这些方法都可以求得两个整数的最大公约数。选择哪种方法取决于具体的情况和性能要求。通常情况下,辗转相除法是最常用的方法,因为它在性能上相对较好。

二当家的 8589

求最大公约数的几种常见的方法 【详解】

这里比较推荐是用 辗转相除法(欧几里得算法)和 《九章算术》中的 更相减损法多说一下,因为当时阿明浅浅学过遍辗转相除法,然后不久后就忘干净了,用的时候还要再去反复找,为了方便使用,干脆把 求解最大公约数 的几种常见的方法详细介绍一下,虽然不是最好,但是多少希望对大家有些帮助!希望大家对这些方法,有更加深刻的印象。加油!!!

加油!!! 2万+

C++求最大公约数的四种方法思路

C++求最小公倍数的四种方法思路 我们对Markdown编辑器进行了一些功能拓展与语法支持,除了标准的Markdown编辑器功能,我们增加了如下几点新功能,帮助你用它写博客: 全新的界面设计 ,将会带来全新的写作体验; 在创作中心设置你喜爱的代码高亮样式,Markdown 将代码片显示选择的高亮样式 进行展示; 增加了 图片拖拽 功能,你可以将本地的图片直接拖拽到编辑区域直接展示; 全新的 KaTeX数学公式 语法; 增加了支持甘特图的mermaid语法1 功能; 增加了 多屏幕编辑 Markdown文章

qq_46459874的博客 8063

辗转相除法、更相减损法、Stein算法

最大公约数和最小公倍数求解,常用的方法是短除法进行因式分解,然后最大公约数是所有公共因子的乘积,最小公倍数是所有因子的乘积。 本质上求最小公倍数就是求最大公倍数:x=m*a, y=m*b;m是最大公约数,那最小公倍数就是m*a*b。所以可以得到最大公约数与最小公倍数的关系: LCM(A,B)×GCD(A,B)=A×BLCM(A,B)×GCD(A,B)=A×B LCM(A,B)×GCD(A,...

优快云文章已停止维护,后续文章会在 https://blog.hufeifei.cn 持续更新 1万+

Windows Server 搭建ftp服务

Windows Server 搭建ftp服务

ch258563的博客 1010

Orange Pi 3B+刷入EmuELEC全过程:手把手教程

手把手教你如何在Orange Pi 3B+上成功刷入emuelec系统,涵盖烧录工具、镜像下载到启动设置的完整流程,让复古游戏体验轻松实现。

weixin_35732273的博客 1090

四种方法计算两个数的最大公约数~~~

1.题目名称 计算两个数的最大公约数 2.题目分析 计算两个数的最大公约数,可以采用最大公约数的四种常用算法,分别是辗转相除法、穷举法、更相减损法、Stein算法。每种方法写一个函数,分别计算出最大公约数,主函数的菜单里有选择功能,用户可以选择自行输入两个数,然后调用这四种方法的任一种;也可以选择程序的测试功能,通过自己选择的组数,计算机自动产生随机函数,然后调用四种方法的任一种,并计算出程序运行...

weixin_44697475的博客 8859

电商数据分析19——数据分析在电商平台价格弹性研究中的应用

价格弹性是一个衡量产品价格变化对销量影响的经济学指标,对于电商平台而言,深入理解和有效运用价格弹性,对于制定竞争策略、优化产品定价具有重要意义。随着大数据时代的到来,通过数据分析研究产品的价格弹性,成为了电商企业制定价格策略、调整市场定位、优化促销活动的重要依据。

theskylife的博客 2834

最大公约数的四种实现方法

求最大公约数的四种方法 一:辗转相除法求最大公约数 辗转相除法:输入俩个数x和y。首先保证x>y;之后x除y得到了余数和结果。将上一个式子的除数赋值给被除数,将余数赋值给除数。判断条件为余数为0; 举个简单的例子(x:被除数,y:除数,z:结果,m:余数) x y z m 15 12 1 3 12 3 4 0 x y z m 15 12 1 3 12 3 4 0 代码实现: 二:辗转相减法求最大公约数 辗转相减法:输入两个数x和y;在保证被减数大于减数的情况下

weixin_44764944的博客 1850

Far planner代码系列(2)

graph_decoder系列(2) 承接上文 我们接着来看decoder_node.cpp的代码部分 void GraphDecoder::Init() { /* initialize subscriber and publisher */ //graph_sub_ 订阅节点/robot_vgraph 其类型是visibility_graph_msg/Graph的消息 graph_sub_ = nh.subscribe("/robot_vgrap...

博客 1534

拆解全球18大“支付清算”体系:CLS、中国、美国、欧洲、日本、mBridge...

拆解全球18大“支付清算”体系:CLS、中国、美国、欧洲、日本、mBridge...

银行信息系统应用架构详解 883

四种方法求最大公约数(Python)

一、最大公约数 二、解题思路 1、暴力枚举法 2、辗转相除法 3、更相减损术 4、更相减损术与移位相结合 一、最大公约数 题目:写一段代码,求出两个整数的最大公约数,要尽量优化算法性能。 二、解题思路 1、暴力枚举法 从较小整数的一半开始,试图找到一个合适的整数i,看这个数能否被a,b同时整除。 它的时间复杂度为O(min(a,b)) 暴力枚举法效率比较低,当我传入的整数是10000和10001时,这种方法要比较10000/2-1=4999次。 暴力枚举法的代码实现: 在这里插入代码片 ...

weixin_43300894的博客 3万+

DeepSeek:为文化创意产业注入AI新动能

沪南胜境,闵行新章。随后,2024 年 5 月,DeepSeek 宣布开源第二代 MoE 大模型 DeepSeek-V2,以其比肩 GPT-4Turbo 的卓越性能,以及仅为 GPT-4 百分之一的价格优势,迅速在市场中掀起波澜,收获了 “AI 届拼多多” 的独特名号,让更多人看到了高性价比 AI 大模型的可能性。创作者自身也应提高对创作伦理的认识,树立正确的创作观念,在使用 AI 工具时,保持对创作的主导权,充分发挥自己的创造力和想象力,将 AI 作为创作的辅助工具,而不是替代品。

远程部署调试 运行安装 项目调试 二次开发 项目技术新 持续迭代 部分源码免费分享 1962

求两个数的最大公约数的四种方法

关于两个数的最大公约数的求法探究                                                            2016年9月12日 求最大公约数是一个很基本的问题,在一些数论题中也有广泛的应用~ 一些公司的面试题也会涉及这方面的知识,所以有必要好好掌握~ 解法一:辗转相除法 (1)递归 int gcd(int x,int y)//辗转相

algzjh的博客 2250

Arduino 系列:Arduino Due 系列 (基于 ATSAM3X8E)_(5).电源管理与电压调节

电源管理与电压调节是确保嵌入式系统稳定性和可靠性的关键环节。通过合理选择电源输入方式、使用高效的电压调节器、设计适当的滤波电路和实施动态电源管理,可以有效提高系统的性能和寿命。同时,使用电源调试工具和编写调试代码,可以帮助开发者及时发现和解决问题。希望本文档能为使用 Arduino Due 的开发者提供有用的信息和指导。

2401_87715305的博客 1309

SAP_MM模块-服务类采购详细讲解案例

SAP_MM模块服务类采购订单配置及业务测试案例详解,包括前台业务操作、后台配置以及使用过程中的问题处理

风沙的博客 5124

Python实现求两数最大公约数(四种方法)

1. 辗转相除法(while循环实现) (1) 两数求余temp = p % q (2) temp = 0时,q为最大公约数 (3) temp !=0时,p = q;q = temp注:该循环的是否继续的判断条件就是temp是否为0 def fuc(p, q): temp = p % q while temp!=0: p = q temp = p ...

qq_43437122的博客 1万+

计算机控制技术及应用

《计算机控制技术及应用》通过总结作者的科研成果和吸收国内外的先进理论、方法和技术,以计算机控制系统的网络化、开放化、智能化和集成化发展趋势为主线索,主要介绍计算机控制系统的基本概念和计算机控制系统的典型形式,计算机控制系统的数学描述与基本分析方法,以及数字PID控制器、最少拍控制系统、达林算法、状态变量设计法等设计方法及其各种改进算法。重点突出计算机控制系统输入输出通道接口的设计方法和典型控制系统的设计案例与实现方法等。

C语言四种方法求最大公约数

一、实验要求 运行最大公约数的常用算法,并进行程序的调试与测试,要求程序设计风格良好,并添加异常处理模块。 二、实验方法(四种) 1.辗转相除法(欧几里德法) C语言中用于计算两个正整数a,b的最大公约数,采用函数嵌套调用形式进行求两个数的最大公约数。其算法过程为: 前提:设两数为a,b设其中a做被除数,b做除数,temp为余数 Steps:大数放a中,小数放b中; 求a/b的余数; 若temp=...

rrrrghi的博客 13万+

jre9下载 jdk9

(Java SE Runtime Environment 9.0) 9.0u175 官方最新版 【x86|x64】

WINCC7.3破解文件

WINCC7.3硬件够破解文件,有需要的下载!WINCC7.3硬件够破解文件,有需要的下载!

最大公约数四种方法及模板

最大公约数分析: 1.暴力法 取min(a,b)暴力循环,O(min(a,b)); 2.辗转相除法,来回辗转,直到余0,但是取模性能较差 3.更相减损术,来回相减,最后两数相等。运算次数太多 4.更相减损术优化: 当a和b均为偶数时,gcd(a,b) = 2×gcd(a/2, b/2) = 2×gcd(a>>1,b>>1)。 当a为偶数,b为奇数时,gcd(a,b) = ...

积木 613

TMS_WebGMaps_1.9.8.0_Full_Source

TMS_WebGMaps_1.9.8.0_Full_Source 全源码 delphi cbuilder

求最大公约数的四种方法(C语言)

题目:运行最大公约数以及最小公倍数的常用算法。 要求:1、至少测20组数据; 2、求出程序的平均运行时间 涉及到的相关知识:求程序运行时间 (1)包含头文件&amp;amp;quot;time.h&amp;amp;quot;;(2)所需函数:clock();(3)类型clock_t。在其头文件time中有一个宏叫#define CLOCKS_PER_SEC ((clock_t)1000),用于衡量秒的单位,1000也就是千分之一秒,就是当过了一毫秒...

qq_44267598的博客 1万+

Python实现求两个正整数的最大公约数(四种方法)

Python实现求两个正整数的最大公约数(四种方法) # 辗转相除法 def fun1(n, m): temp = n % m while temp != 0: n = m m = temp temp = n % m return m # 辗转相减法 def fun2(n, m): while n != m: if n > m: n = n - m else:

qq_43618698的博客 2万+

C++丨常见的四种求最大公约数方法!赶紧收藏!

为了更好的了解算法的概念,今天会分享一些C++求最大公约数几种常见的算法。 第一种:穷举法之一 穷举法,也叫枚举法,求最大公约数时从两者中较小的数开始,由大到小列举,直到找到第一个公约数为止。 解释:拿其中一个数出来,用一个临时变量(tem)保存,每次都把那两个数除以这个临时变量。如果能除断,直接返回tem;如果不能除断,tem- -,直到都能除断,再返回tem。tem就是它们的最大公约数。 #include <iostream> using namespace std; .

Hsuesh的博客 1万+

四种方法求最大公约数

一、题目分析 实验题目:运行最大公约数的常用算法,并进行程序的调式与测试,要求程序设计风格良好,并添加异常处理模块(如输入非法等)。 分析:运用四种算法分别计算最大公约数,并选择手动输入数据验证算法正确和产生20组数据比较算法优劣 二、算法构造 1,辗转相除法 2,穷举法 3,更相减损法 4,Stein算法 三,算法实现 #include&lt;iostream&gt; #include...

qq_43407321的博客 2222

python求两个数的最大公约数穷举法_C++求最大公约数四种方法解析

C++求最大公约数的四种方法思路,供大家参考,具体内容如下将最近学的求最大公约数的四种方法总结如下:第一种:穷举法之一解释:拿其中一个数出来,用一个临时变量(tem)保存,每次都把那两个数除以这个临时变量。如果能除断,直接返回tem;如果不能除断,tem- -,直到都能除断,再返回tem。tem就是它们的最大公约数。#include using namespace std;int CommFact...

weixin_32377497的博客 1154

python求最大公约数和最小公倍数的四种方法

这里写自定义目录标题python求最大公约数和最小公倍数的两种方法 python求最大公约数和最小公倍数的两种方法 最大公约数和最小公倍数的求解可以归结为求最大公约数,最小公倍数为两数乘积除以最大公约数。 a, b = 10, 25 def gcd1(x, y): if x > y: x, y = y, x for i in range(x, 1, -1): if x % i == 0 and y % i == 0: retu

weixin_53624744的博客 2229

四种方法求两个数的最大公约数

一:题目分析(求出两个数的最大公约数) 辗转相除法: 其算法过程为: 前提:设两数为a , b设其中a 做被除数,b做除数,temp为余数 1、大数放a中、小数放b中; 2、求a/b的余数; 3、若temp=0则b为最大公约数; 4、如果temp!=0则把b的值给a、temp的值给a; 5、返回第二步; 穷举法: 对两个正整数a , b如果能在区间[0,a]或[0,b]内能找到一个整数temp能同...

weixin_43973586的博客 1万+
上一篇: 算法笔记-lc-面试题 17.19. 消失的两个数字(困难)
下一篇: 算法笔记-lc-面试题 17.09. 第 k 个数(中等)
Hell_potato777
博客等级 码龄6年 47粉丝 106原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值