Python两种方式求多个数的最大公因数(HCF)和最小公倍数(LCM)
最大公因数
1. 列表排序
将输入的正整数列表由小到大进行排序。
numlist.sort()
2. 将列表分为两部分
又因为最大公因数必然小于等于最小的数,故将列表分为最小的数和除最小的数以外的数两个部分,同时对最小的数进行质因数分解。
minpflist = pf(numlist[0])[1] #最小的数的质因数分解列表
numlist1 = numlist[1:] #除最小的数以外的数的列表
其中用到了pf函数,参见我的Python判断质数合数,质因数分解并得到所有因数。
该函数可用于判断一个大于一的正整数是质数还是合数,进行质因数分解并求出其所有正因数。若最小数恰好为1,将在后续步骤提供处理办法。该函数的代码如下:
def pf(x):
import math
def isprime(x1):
max = int(math.sqrt(x1))
for i in range(2, max+1):
if x1 % i == 0:
return True
return False
resultlist = [isprime(x)]
prime_factor = []
for f in range(2, x+1):
if not isprime(f):
ff = f
while x % ff == 0:
prime_factor.append(f)
ff *= f
resultlist.append(prime_factor)
factors = []
for factor in range(1, x+1):
if x % factor == 0:
factors.append(factor)
resultlist.append(factors)
return resultlist
3. 求最大公因数的质因子
先创建一个空列表用来储存要求的最大公因数的质因子:
cpflist = []
要求的最大公因数的质因子一定在minpflist这个列表中,故只需遍历该列表中的每一个值,是否能整除numlist1中的每一个数。若不能,则跳过;若能,则加入到cpflist中,同时如果minpflist中还有该数的话,检查该数能否再次整除numlist1中除过该数的商,直到不能为止:
for minpf in minpflist:
iscf = True
for num in numlist1:
if num % minpf != 0:
iscf = False
if iscf == True:
#将numlist1中每个数除以minpf,以判断能否再被除尽
for i in range(len(numlist1)):
numlist1[i] = numlist1[i] / minpf
cpflist.append(minpf)
4. 得到结果
将得到的cpflist中每个数相乘,结果就是要求的最大公因数。
先将最大公因数初始值设为1,能解决当numlist中最小数为1时造成的pf(1)[1] = []
从而无法得到正确的最大公因数的问题:
maxcommonfactor = 1
再进行累乘:
for cpf in cpflist:
maxcommonfactor *= cpf
return maxcommonfactor
得到的maxcommonfactor即为最大公因数。
5. 完整程序
全部代码如下:
def maxcf(*nums):
numlist = list(nums)
numlist.sort()
minpflist = pf(numlist[0])[1]
numlist1 = numlist[1:]
cpflist = []
for minpf in minpflist:
iscf = True
for num in numlist1:
if num % minpf != 0:
iscf = False
if iscf == True:
for i in range(len(numlist1)):
numlist1[i] = numlist1[i] / minpf
cpflist.append(minpf)
maxcommonfactor = 1
for cpf in cpflist:
maxcommonfactor *= cpf
return maxcommonfactor
最小公倍数
在上述步骤的基础上,利用两个数的最大公因数与最小公倍数的乘积等于这两个数的乘积这一公式,可求得多个数的最小公倍数。
def mincm(numlist):
numlist = list(nums)
for numx in range(1, len(numlist)):
maxcf1 = maxcf([numlist[numx],numlist[numx-1]])
mincm1 = int(numlist[numx] * numlist[numx-1] / maxcf1)
numlist[numx] = mincm1
return mincm1
另一种实现形式
利用math.gcd求出两个数的最大公因数,遍历输入列表中的所有数,进行求解。这种实现形式更为简单。当然,在求最小公倍数时,同样需要利用两个数的最大公因数与最小公倍数的乘积等于这两个数的乘积这一公式。
def maxcf(*nums):
import math
numlist = list(nums)
maxcommonfactor = numlist[0]
numlist = numlist[1:]
for num in numlist:
maxcommonfactor = math.gcd(maxcommonfactor, num)
return maxcommonfactor
def mincm(*nums):
import math
numlist = list(nums)
for numx in range(1, len(numlist)):
maxcf1 = math.gcd(numlist[numx], numlist[numx-1])
mincm1 = int(numlist[numx] * numlist[numx-1] / maxcf1)
numlist[numx] = mincm1
return mincm1
运行结果
运行结果如下:
>>> maxcf(18, 27, 69)
3
>>> maxcf(156, 44, 57)
1
>>> maxcf(100, 2025, 465)
5
>>> mincm(77, 25, 18)
34650
>>> mincm(58, 26, 40)
15080
>>> mincm(12, 24, 18)
72