最大公约数的四种方法

求最大公约数的四种算法 一. 题目分析 如果有一个自然数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万+

【sap2000】部分模型通过.s2k文件合并模型generating a global model through partial models by .s2k text file

现在需要通过选项File → Import → SAP2000 .s2k Text File → Add to existing model(如果使用其中一个部分模型作为基础)或New model(如果使用新文件)添加部分模型,并使用以下导入选项。模型A(阶段1/5) Model A (Phase 1/5)模型B(阶段2/5) Model B (Phase 2/5)模型C(阶段3/5) Model C (Phase 3/5)模型E(阶段5/5) Model E (Phase 5/5)

hmywillstronger的博客 1749

cut&tag学习笔记

上图是我得到的结果,下图是教程的结果,比对结果有一些差异,我也不知道具体原因是啥。谷歌了一下,发现原因可能是因为环境变量的问题,系统不知道picard的具体位置,需要设置全局环境变量,遂查了一下picard的位置。我发现我做出来的结果测序深度一致,但是比对的结果有一点差异,不知道是我的操作问题,还是参考基因组更新了导致比对结果出现了些许不同。上图是我得到的结果,下图是教程的结果,除了IgG_rep1外比对结果一致。上图是我的结果,下图是教程的结果,结果不太一致,不知道是具体的原因是什么。

weixin_52073820的博客 2422

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

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

weixin_44697475的博客 8860

ST MotorControl Workbench 6.2.1 自定义硬件配置避坑指南

本文详细介绍了ST MotorControl Workbench 6.2.1在自定义硬件配置中的常见问题与解决方案,涵盖功率板配置、采样电路校准、电机参数设置及代码生成避坑指南,帮助开发者高效完成电机控制项目开发。

red88的博客 1023

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

求最大公约数的四种方法 一:辗转相除法求最大公约数 辗转相除法:输入俩个数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

SAP 物料的分割评估

SAP 物料的分割评估 前言 本文主要讲解SAP中物料的分割评估,通过分割评估来区分出同一物料不同来源下的核算方式。例如:同一物料分为自产或者采购,或者同一物料分为进口或者国内采购等。 一、概述 分割评估一般用于以下场景: 1、物料分为内部采购和外部采购; 2、物料分属于进口或者国内采购; 3、物料分属于不同的批次; 4、物料分为自制或者采购。 由于物料的来源不同可能导致物料的价格或者性质不同,需要用不同价格来区分出 二、配置步骤 1.激活分割评估 ...

五谷散熊 6791

PLC凸轮开关指令编程应用——控制算法

凸轮开关指令的作用是在PLC程序中根据凸轮开关(Cam Switch)的状态执行不同的操作。凸轮开关通常是机械式的开关装置,它的位置会随着机械运动的变化而改变。凸轮开关的状态可以用来检测机器的位置、角度或其他相关信息,从而触发相应的控制动作。总结起来,凸轮开关指令是PLC编程中常用的一种控制算法,通过检测凸轮开关的状态来触发相应的操作。本文将介绍凸轮开关指令的应用和相应的控制算法,并提供相关的源代码示例。在这个示例中,凸轮开关状态的值代表不同的位置,根据凸轮开关状态的不同,执行相应的动作。

LiJavascript的博客 1034

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

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

weixin_43300894的博客 3万+

黑猫带你学eMMC协议第11篇:eMMC擦除详解(erase/trim/discard/sanitize/secure erase/secure trim...)

erase命令单位是擦除组,那么一个擦出组包含多个写块,不同写块有不同信息,主机擦除之前,必须进行确定好这些写块中的信息没有用了。所以通常erase用来擦除整个设备或分区。erase完成后,将erase的区域都要么是全0,要么是全1。那么到底是0还是1呢,根据不同的工艺有所不同,但是别担心,在ecsd[181]中会有说明到底是1还是0。erase命令的作用就是简单的将映射地址范围移动到未映射的地址范围。

黑猫奥利奥的博客 7797

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

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

algzjh的博客 2250

【网络与爬虫 41】TLS指纹伪造技术深度解析:ja3、ja4反检测与绕过策略

TLS指纹是现代反爬虫系统的重要检测手段,通过分析客户端TLS握手特征来识别爬虫。本文将深入解析ja3、ja4等TLS指纹技术原理,详细介绍指纹伪造和绕过策略,通过实际代码示例和工具使用,帮助开发者掌握TLS指纹反检测技术,构建更隐蔽的网络爬虫系统。

熵数实验室 1万+

UG NX二次开发(C++)-NX2406系列二次开发编程模板配置

前面已经写了有关UG NX二次开发编程模板配置的文章,但是由于NX2406/2412系列的版本中,在UGOpen文件夹中没有了vs_files文件夹了,而是采用了VSIX Project的方式配置(其适用于VS2019),在VS2022中不能正确的配置。我结合以前配置模板的经验和现在的配置方式讲一下NX2406系列二次开发编程模板的配置。我把相应的编程模板放在资源文件UG NX二次开发编程模板(基于NX2406版本制作)中,方便大家下载使用。

GimiGimmy 2640

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万+

VC中sqlite的使用

在VC中对sqlite的使用,实现数据库大批数据的快速插入,读取数据库中的数据在ListCtrl中显示

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】

IEM模型,地表粗糙度模拟

利用微波反演土壤水分时候,利用IEM模型可以实现对随机地表的模拟

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

最大公约数分析: 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

android 蓝牙通讯demo

android 下蓝牙通讯demo,实现了发现蓝牙,使能蓝牙,通过蓝牙发送消息。

求最大公约数的四种方法(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、付费专栏及课程。

余额充值