算法学习

数据结构与算法学习(三)——最大公约数和最小公倍数

2019-11-09  本文已影响0人  namedsatan

最大公约数和最小公倍数是我们小学学习的,那时候我们求最大公约数,往往是将两数的所有约数全部列出来,然后找出共有的约数中其中最大的那个;而求最小公倍数也往往是将两数的倍数一一列出,找出相等的倍数中最小的那个。

好吧😂,原谅我的无知。。。原来还可以用短除法求最大公约数和最小公倍数,小学白学了😂,一直穷举穷举了六年,我枯了😭。

短除法
最大公约数:

最小公倍数:2 \times 5 \times 1 \times 2 = 20

使用计算机编程计算最小公约数和最小公倍数有很多种方法,下面将进行总结。

1. 最大公约数

求最大公约数的方法我总结了4种方法:

  1. 穷举法
  2. 辗转相除法
  3. 更相减损术
  4. Stein算法

下面分别讲解:

1.1 穷举法

1.2 辗转相除法(欧几里得算法)

辗转相除法,又名欧几里得算法,其基本原理: 两个整数的最大公约数等于其中较小的数和两数相除余数的最大公约数 。一看这基本原理是不是激动了一下😎,又可以用递归了。下面给出递归和非递归的两种实现。具体介绍详见维基百科

维基百科错误

(这怕是假的维基百科,还真像《瑞克和莫蒂》中说的一样,谁都可以写。。。确实谁都可以写23333😂。辗转相除法和更相减损术傻傻分不清🙄,我已提交错误)。

1.2.1 非递归实现
1.2.2 递归实现

1.3 更相减损术

可半者半之,不可半者,副置分母、子之数,以少减多,更相减损,求其等也。以等数约之。——《九章算术》

白话译文:(如果需要对分数进行约分,那么)可以折半的话,就折半(也就是用2来约分)。如果不可以折半的话,那么就比较分母和分子的大小,用大数减去小数,互相减来减去,一直到减数与差相等为止,用这个相等的数字来约分。——《百度百科》

先搬出原著古文以及百度百科(Google时没有看见维基百科的,看来要找个时间给它安排上😎)的译文,不得不佩服古人的智慧。更相减损术的基本步骤是:对于这两个数a,b,首先判断他们是否为偶数,如果是偶数,两者都除以2;如果不是,则用较大的数a减去较小的数b,用得到的差temp与较小的数b进行比较,如果相等,则差temp即为最大公约数;如果不相等,令将小数b的值赋给大数a,差temp的值赋给小数b,即a = b,b = temp。继续从头开始执行,直到相等时,temp值乘以约去的2即为最大公约数。(流程图待补充)

1.4 Stein算法


2. 最小公倍数

求最大公约数的方法我总结了2种方法:

  1. 穷举法
  2. 利用最大公约数

2.1 穷举法

2.2 利用最大公约数

3. 参考文章

  1. https://blog.csdn.net/Holmofy/article/details/76401074
上一篇 下一篇

猜你喜欢

热点阅读