Python两种方式求多个数的最大公因数(HCF)和最小公倍数(LCM)

  • 最大公因数
    • 1. 列表排序
    • 2. 将列表分为两部分
    • 3. 求最大公因数的质因子
    • 4. 得到结果
    • 5. 完整程序
  • 最小公倍数
  • 另一种实现形式
  • 运行结果

最大公因数

1. 列表排序

将输入的正整数列表由小到大进行排序。

numlist.sort()

2. 将列表分为两部分

又因为最大公因数必然小于等于最小的数,故将列表分为最小的数和除最小的数以外的数两个部分,同时对最小的数进行质因数分解。

minpflist = pf(numlist[0])[1] #最小的数的质因数分解列表
numlist1 = numlist[1:] #除最小的数以外的数的列表

其中用到了pf函数,参见我的Python判断质数合数,质因数分解并得到所有因数。
该函数可用于判断一个大于一的正整数是质数还是合数,进行质因数分解并求出其所有正因数。若最小数恰好为1,将在后续步骤提供处理办法。该函数的代码如下:

def pf(x):import mathdef isprime(x1):max = int(math.sqrt(x1))for i in range(2, max+1):if x1 % i == 0:return Truereturn Falseresultlist = [isprime(x)]prime_factor = []for f in range(2, x+1):if not isprime(f):ff = fwhile x % ff == 0:prime_factor.append(f)ff *= fresultlist.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 = Truefor num in numlist1:if num % minpf != 0:iscf = Falseif iscf == True:#将numlist1中每个数除以minpf,以判断能否再被除尽for i in range(len(numlist1)):numlist1[i] = numlist1[i] / minpfcpflist.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 = Truefor num in numlist1:if num % minpf != 0:iscf = Falseif iscf == True:for i in range(len(numlist1)):numlist1[i] = numlist1[i] / minpfcpflist.append(minpf)maxcommonfactor = 1for cpf in cpflist:maxcommonfactor *= cpfreturn 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] = mincm1return mincm1

另一种实现形式

利用math.gcd求出两个数的最大公因数,遍历输入列表中的所有数,进行求解。这种实现形式更为简单。当然,在求最小公倍数时,同样需要利用两个数的最大公因数与最小公倍数的乘积等于这两个数的乘积这一公式。

def maxcf(*nums):import mathnumlist = list(nums)maxcommonfactor = numlist[0]numlist = numlist[1:]for num in numlist:maxcommonfactor = math.gcd(maxcommonfactor, num)return maxcommonfactordef mincm(*nums):import mathnumlist = 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] = mincm1return 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

Python两种方式求多个数的最大公因数(HCF)和最小公倍数(LCM)相关推荐

  1. Java练习:两种方式求1+1/2!+1/3!+1/4!+...前20项的和、用for,while,do-while分别实现1+1/2!+1/3!+1/4!+...前20项的和

    Java两种方式求 1+1/2!+1/3!+1/4!+... 前20项的和: 感叹号 !是阶乘的意思,如 2! .3! .4! 分别是:1*2 . 1*2*3 .1*2*3*4  第一种算法,如下代码 ...

  2. 417,BFS和DFS两种方式求岛屿的最大面积

    想了解更多数据结构以及算法题,可以关注微信公众号"数据结构和算法",每天一题为你精彩解答.也可以扫描下面的二维码关注 给定一个包含了一些0和1的非空二维数组grid . 一个岛屿是 ...

  3. python两种方式实现读写航拍影像JPG图片的GPS坐标

    写入坐标效果 读取坐标效果 1.写入JPG坐标数据 1.1.准备数据 gps坐标文件 图片 可以查看它的属性中目前并没有坐标信息 1.2.执行脚本 第一种方法(piexif) writegps2jpg ...

  4. python求两个数的最大公约数穷举法_五十九、如何求N个数的最大公约数和最小公倍数...

    「@Author:Runsen」 ❝ 编程的本质来源于算法,而算法的本质来源于数学,编程只不过将数学题进行代码化.「---- Runsen」 ❞ 上次介绍了短除法的因式分解,下面正式进入求解:「两个及 ...

  5. 运行python程序的两种方式交互式和文件式_Python基础知识2

    运行Python程序的两种方式 小白学习,如有错误欢迎指点 一.每位小白写的第一个Python程序 1.运行Python程序的两种方式 1.1 交互式模式(即时对话) 打开cmd,打开Python解释 ...

  6. 周一02.3运行python程序的两种方式

    一.运行python程序的两种方式 方法一:交互式:                      优点:输入一行代码立刻返回结果                       缺点:无法永久保存代码 方法 ...

  7. 简单介绍python连接telnet和ssh的两种方式

    本文主要介绍了python连接telnet和ssh的两种方式,文中通过示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下 Telnet 连接方式 #!/usr/bin/env p ...

  8. python: 多线程实现的两种方式及让多条命令并发执行

    一 概念介绍 Thread 是threading模块中最重要的类之一,可以使用它来创建线程.有两种方式来创建线程:一种是通过继承Thread类,重写它的run方法:另一种是创建一个threading. ...

  9. Python字符串的两种方式——百分号方式,format的方式

    Python的字符串格式化有两种方式: 百分号方式.format方式 百分号的方式相对来说比较老,而format方式则是比较先进的方式,企图替换古老的方式,目前两者并存.[PEP-3101] This ...

最新文章

  1. 不要假装很努力,因为结果不会陪你演戏
  2. Oracle 11g服务器与客户端卸载、安装
  3. Bom技术类型的讲解
  4. Debug docker: docker: Error response from daemon: could not select device driver ““ with capabilitie
  5. 综述 | 联邦学习-新兴的人工智能基础技术
  6. 递归查找所有子代id php,PHP递归函数:从父ID获取子ID
  7. Qt信号阻塞和断开信号槽
  8. IntelliJ IDEA提示忽略大小写
  9. Windows 利用DbgView 查看内核打印日志
  10. ABAP调用HTTP服务
  11. pr cpu100%_PR插件Neat Video5.0.2安装教程
  12. Flash-制作空心文字
  13. 电缆公司如何面对企业改革?MES系统打造智能工厂
  14. 直播推流拉流概念介绍
  15. MySql两台服务器(主机)间热备份(双机热备份)
  16. 微信小程序销毁某一注册函数_微信小程序注销手册
  17. vue elementui table 复选框
  18. Android 优化之 纹理
  19. 彻底理解thunk函数与co框架
  20. 刷金币全自动脚本 | 让Python每天帮你薅一个早餐钱(送源码)

热门文章

  1. css文件插入背景音乐,关注css背景音乐代码
  2. Python中的sin和cos函数
  3. 异构数据源DDL转换的两种方式
  4. linux 命令行修改mac,Linux下修改MAC地址
  5. python在国内外研究现状_机器人教育_国内外Python课程现状?
  6. 微信小程序获取用户头像昵称组件封装(最新版)
  7. hgame2023 week1 writeup
  8. vue大文件下载(下载进度展示)
  9. 腾讯地图标记点击事件
  10. Python实现去除图片中的数字水印