前言:
在我们学习数学的过程中学习过如何求出两个数的最大公约数之类的解题方式,不过大多都是用眼睛一看在进行递推就可以求出,那么这篇文章将会将解如何让python帮我们算出,同时也介绍两种算法。
算法:
在我们的数学中有许许多多的算法,比如加法,减法等等之类的,但不知道大家有没有换一个角度想过求公约数的算法,接下来就是具体的讲解。
运用《九章算术》里面的更相减损算法:
这种算法是由我国古代数学家的伟大创举,与欧几里得的《几何原本》卷七第一题所论相同。先看如下表格,在进行代码分析:
示例与讲解:
a=91 b=49
91-49=42
此时的a就变成了42
49-42=7
因为a<b所以拿b-a,此时的b为7
42-7=35
因a>b,所a-b,此时a=35
35-7=28
因a>b,所a-b,此时a=28
28-7=21
因a>b,所a-b,此时a=21
21-7=14
因a>b,所a-b,此时a=14
14-7=7
因a>b,所a-b,此时a=7
如果想要求出91与49的最大公约数,我们先可以将两数分裂到一处,先由91-47,余42,再由49-42,余7;进一步由42-7五次余7,结果就是:左右两边余数相等,而这相等的两个余数就是91与49的最大公约数。
让我们来抓一下关键词眼:余数,比大小,替换,余数相等。知道了这一些关键的信息之后我们就可以开始书写代码了,代码如下:
def gcd1(a, b): # 运用《九章算数》P5“更相减损”算法
while True:
if a > b:
a -= b
if b > a:
b -= a
else:
if a == b:
print(f"两数最大公约数为:{a}")
break
else:
continue
开始代码解析,我们都知道如果要一直延续下去那就的用到循环,而小编讲过的循坏只有两个,for和while,而在这里小编选择使用while循环,原因就是这个循环操作起来比for循环要简单一点。
其次,比大小和替换,于是小编输入了两个相应的判断条件,每一个条件下面都有大减小余数这一个过程。至于替换小编在这里使用了a-=b这代码,这是a=a-b代码的缩写。
再然后就是余数相等,为了便于理解,小编在这里采用了相对来说比较繁琐的方法,再次确实两数相等。如果不是,那么代码最后的continue就可以发挥作用了。
小总结:
如果采用了《九章算术》这一种更相减损方法的话,只需要注意:判断两数大小,替换原有数值,判断相等这几个主要的条件即可。
阿基米德的辗转相除法:
相较于代码数量比较多的更相相减法来说,阿基米德的辗转相除法代码比较精简,但对于数学不是很好的看客来说可能有点难以理解,先来看一张图片的证明。
示例与讲解:
这个 图片就证明了阿基米德的方法,可能是小编画的不够标准,现在由小编来给各位解释一下。
这是一个长16,高6的长方形,在里面有两个边长为6的正方形和一个边长为4的正方形,还有两个边长为2的正方形,通过图像我们可以知道,16和6两数的最大公约数就是2。
这个算法的主要公式就是:(被除数,除数)=(除数,余数),用字母表示就是A=B*C+D,在转化一下就是(A,B)=(B,D),在进行书面计算(这里计算的是16和6的最大公约数)就是:
(16,6) 输入两数 | (6,4) 16=6*2+4,所以余数为4 |
(6,4) 上一步照抄 | (4,2) 6=1*4+2,所以余数为2 |
(4,2) 上一步照抄 | (2,0) 4 = 2*2+0,所以余数为0 |
通过这个表可以看出辗转相除法的核心就是除数和余数,且余数为0的话,那么那一步的除数就是最大的公约数,就比如(2,0)余数为0,所以最大公约数就是2。
大概的逻辑相信大家也有了初步的了解,现在开始抓词眼:余数,除数,为0。开始书写代码:
def gcd2(a, b): # 运用阿基米德的辗转相除算法
while b != 0:
a, b = b, a % b
if b == 0:
print(f"两数最大公约数为:{a}。")
return a
开始代码的解析,和前面一样创建了一个名为gcd2的函数,且采取了同样的while循环,不同的就是循环的条件不同,这个循环只有在参数b不为0的情况下开始运行。这样子的代码可以让我们运行a, b = b, a % b时不需要添加b=0的判断条件,因为b只要为0代码就会结束,代码的最后加入了一个return的返回值函数,将处理过后的a值返回到前面的a值。
小总结:
相较于代码量而言,阿基米德的算法比九章的算法少,但也不排除是小编技术不到家。不同的是阿基米德的算法相对而言理解比较难一点,而九章算术的算法就是比较好理解。
总结:
该文章为大家介绍了两种解决两数最大公约数的算法和相对应的简单逻辑代码,可能有人就会有疑问,我会更相减损为什么还要用辗转相除,小编在这里只能说更相减损比较适合数值不大的前提下,而辗转相除法就可以解决数值比较大的计算。进一步的用法就需要大家多去了解和参悟了,小编在这里感谢大家的观摩。