文章目录
- 前言
- 代码演示以及讲解
- 1.原理
- 2.讲解
- 总结
前言
求最大公因数和最小公倍数小学生都会,为什么我们还要再高中再学一遍呢?原因就是随着科技发展,数变得越来越大,相应的计算也变得越来越多。而小学的方法在面对大数时显得就十分苍白无力了,于是高中阶段通过学习研究数论,我们知道了一系列更为简洁,高效的公式来求HCF(最大公因数),比如辗转相除法,更相减损术。而我们通过学习HCF和LCM(最小公倍数)的关系就可以根据HCF求出LCM(即公式法)。因为人脑的运算能力有限,所以我们把一些重复的,复杂的计算抛给计算机做,大大的提高了工作效率。而高中的方法相对于小学的,更具有一般性。如果应用在编程上,他会消耗更少的电脑资源和其计算能力,而且代码会看起来整洁有序。求最大公因数在数学界有广泛的应用,尤其是辗转相除法,从基本计算的通分,连分数的计算,到发展欧几里得算法,都有不少他的身影。
二、代码演示以及讲解
1.原理
这段求多个数的最大公因数和最小公倍数的代码使用到了更相减损术算法和一个数学公式:(a,b)*[a,b]=a*b(两数最大公因数和最小公倍数的积等于两数的积)。我们用HCF(highest common factor)表示最大公因数,LCM(lowest common multiple)表示最小公倍数。
如果我们想求三个整数a,b,c的HCF和LCM,我们就需要先求出a,b的HCF和LCM(即(a,b)和[a,b]),再求出c与(a,b)的HCF,和c与[a,b]的LCM( 即(c,(a,b))和[c,[a,b]] ),从而得出这三个数的HCF和LCM。求三个以上的数的HCF和LCM步骤和与上面类似。对这个原理感兴趣的读者可以看一下他们的数学证明,帮助理解。
代码如下:
class Num:
@classmethod
#求两数的最大公因数
def HCF(cls,num1,num2):
div = 0
lst=[num1,num2]
if num2>num1:
lst[0],lst[1]=lst[1],lst[0]
while lst[0]!=lst[1]:
div = lst[1]
lst[1] = lst[0]-lst[1]
lst[0] = div
if lst[0]<lst[1]:
lst[0],lst[1]=lst[1],lst[0]//元素交换位置
return lst[1]
@classmethod
# 求两数的最小公倍数
def LCM(cls, num1, num2):
return int(num1*num2/cls.HCF(num1, num2))
@classmethod
#求多个数的最大公因数或最小公倍数
def multi(cls, func, lst):
i = 0
while i<len(lst)-1:
j=i+1
lst[j]=func(lst[i],lst[j])
i+=1
return lst[-1]
lst=[20,15,12]#三个整数
# lst=[int(i) for i in input("use comma to separate:").split(",")]
run = Num()
print(run.multi(run.HCF,lst))#打印这三个数的最大公因数
2.讲解:
这是个面向对象的代码,使用起来非常简单便捷,其中“@classmethod”用来指定一个类内的函数为类方法,和self相似,但用起来却比他方便。本来用self你还要实例化,现在你想添加一个新方法只需要写下新函数并用“@classmethod”装饰以下就能用了,多方便!(别忘了函数第一个参数,表示自身类,大概意思就是加了他函数就会成为一个类方法)
类方法HCF()求的是两个数的最大公因数。因为它用的是纯数学方法,因此要先了解更相减损术的计算方法和原理才能理解这段长相怪异的代码,这里不做解释。
LCM(),求两个数的最小公倍数,计算方法是:[a,b]=a*b/(a,b),由公式(a,b)*[a,b]=a*b变形而来。因此这里就需要先求出这两个数的最大公因数,我们调用类方法cls.HCF()就能解决这个问题。
接下来的multi()类方法将HCF,LCM求算拓展到了多个数;他的第二个参数是一个函数,指的是类方法HCF()或LCM()。multi()的运算原理主要在“原理”中,不记得可以再回去复习一下。我在这里简单举个例子加深理解。首先假设lst=[51,85,5],要求他们三个的最大公因数,我们令func=HCF。
我们开始演示multi()方法中的代码。首先初始化i并赋值为0,这个变量是求HCF,LCM所需的两个整数中索引较小的。比如51,85中,51在列表的索引为0,小于85的索引,因此i就是51的索引。接下来有一个while条件判断执行边界,因为是求HCF,LCM是两个两个数去求,所以在上面例子中i不能是2,因为i对应的索引是两数中索引较小的,而索引2对应的5后面没有元素了,因此while执行条件是i<len(lst)-1。满足条件则进入循环:先求出lst[0], lst[1]的最大公因数——等于17,令其等于lst[1],并让i自增1。接着求出lst[1]和lst[2]的最大公因数——等于1,再让i自增1。此时i=2,不满足while条件,退出循环,所以最后返回1。这就是这lst列表中3个元素的最大公因数。
最后就是在类Num之外实例调用方法,并将结果打印出来。大家注意一下格式(比如run.multi() 调用Num()中的方法)
总结
以上就是今天要讲的内容,本文简单介绍了求多数的HCF,LCM的程序实现,该程序通过简单的数学公式和类结构,大大的节省了电脑计算能力,同时函数的使用使得代码结构十分清晰易懂。在以后这个计算方法也可以被用于其他程序。