最大公约数的四种方法

这篇具有很好参考价值的文章主要介绍了最大公约数的四种方法。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

前言

求两数的最大公约数,一共有四种方法:暴力穷举法、更相减损法、辗转相除法、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)即为两数的最大公约数。文章来源地址https://www.toymoban.com/news/detail-448683.html

到了这里,关于最大公约数的四种方法的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • C语言入门——求最大公约数(2种方法超详细)

    基本介绍: 最大公约数(greatest common divisor,简写为 gcd ;或highest common factor,简写为hcf),指某几个整数共有因子中最大的一个。 最大公约数 能够整除一个整数的整数称为其的约数(如5是10约数); 能够被一个整数整除的整数称为其的倍数(如10是5的倍数); 如果一个数既

    2024年02月08日
    浏览(102)
  • 你会求两个数的最大公约数吗(三种方法)?

    目录 前言 一、枚举法 二、辗转相除法 三、更相减损法 如何求两个数的最大公约数是非常经典的问题,求解的方法也有很多,本文主要介绍其中的三种方法,分别是: 枚举法、辗转相除法和更相减损法 。   两个数的最大公约数一定小于或等于两数中较小的数,并且这两个

    2023年04月08日
    浏览(49)
  • 【约数】求最大公约数——递归

    请使用递归算法计算正整数n和m的最大公约数GCD(n,m)。 G C D ( n , m ) = { = m , 当 m = n 且 n m o d m = 0 = G C D ( m , n ) , 当 n m 时 = G C D ( m , n m o d    m ) , 其他 GCD(n,m)=left{begin{matrix} =m,当 m=n 且 n mod m =0\\\\ =GCD(m,n),当nm时\\\\ =GCD(m,n mod m),其他 end{matrix}right. GC D ( n , m ) = ⎩ ⎨ ⎧ ​ = m

    2024年02月03日
    浏览(42)
  • 辗转相除法求最大公约数

    辗转相除法也被称为欧几里得算法,是求两个整数的最大公约数(GCD)的一种常用方法。 辗转相除法的原理是基于两个整数的最大公约数与它们的余数的最大公约数相等的性质。具体步骤如下: 用较大的数除以较小的数,得到一个商和余数。 如果余数为0,则较小的数即为最

    2024年02月05日
    浏览(66)
  • 最大公约数和最小公倍数问题

    等差数列 蓝桥杯192 gcd问题 题目描述 数学老师给小明出了一道等差数列求和的题目。但是粗心的小明忘记了一 部分的数列,只记得其中 N 个整数。 现在给出这 N 个整数,小明想知道包含这 N 个整数的最短的等差数列有几项? 思路:求出每一项之差的最大公约数,以这个

    2023年04月09日
    浏览(41)
  • C++ 最大公约数与最小公倍数

    (一)简单的两个正整数  求 最大公约数 (引入专题) 思路: 根据 “欧几里得算法”  ,即 “辗转相除法” 原理如下: 题意: 求出   a  , b  两个正整数的最大公约数 设  k = a / b,   r = a % b 即    a = k * b + r 又设  d  为 a 和 b 的一个公约数 那么由  r = a - k * b,  可

    2024年02月06日
    浏览(48)
  • 【算法】辗转相除法求最大公约数

    辗转相除法 ,又称 欧几里德算法(Euclidean Algorithm) ,是求两个数的 最大公约数(greatest common divisor) 的一种方法。用较大的数除以较小的数,再以除数和余数反复做除法运算,当余数为0时,取当前算式除数为最大公约数。 求30和18的最大公约数: 30 /  18  = 1 余  12 18 

    2024年02月14日
    浏览(56)
  • 【ARM汇编】如何用汇编求最大公约数?

    CSDN话题挑战赛第1期 活动详情地址 :话题PK赛 参赛话题 :汇编知识分享 话题描述 :我们的计算机知识就像一座金字塔,底层是数学,上面是数字电路,然后是汇编,再往上是操作系统、网络、数据库、高级编程语言、框架等等…我们不可能精通这个金子塔的每一层, 但是

    2024年01月25日
    浏览(47)
  • C语言—最大公约数和最小公倍数

    作者主页: paper jie的博客_CSDN博客-C语言,算法详解领域博主 本文作者: 大家好,我是paper jie,感谢你阅读本文,欢迎一建三连哦。 本文录入于 《算法详解》专栏,本专栏是针对于大学生,编程小白精心打造的。笔者用重金(时间和精力)打造,将算法基础知识一网打尽,希望

    2024年02月13日
    浏览(42)
  • 辗转相除法——求最大公约数(易懂详解)

    定义 最大公因数:也称最大公约数、最大公因子,指两个或多个整数共有约数中最大的一个。 辗转相除法:欧几里得算法又称辗转相除法,是指用于计算两个非负整数a,b的最大公约数。应用领域有数学和计算机两个方面。计算公式gcd(a,b) = gcd(b,a mod b)。 举例理解 比如现在要

    2024年02月16日
    浏览(41)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包