栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > Python

python 辗转相除法求一组数的最大公约数

Python 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

python 辗转相除法求一组数的最大公约数

今天散步时偶然想起了之前写的辗转相除法求两个数最大公约数的代码,突然想到了求一组数的最大公约数的方法,基本代码如下

l=list(eval(input("请输入一组数n")))
#l1=l                           #求最小公倍数时要用到
l=sorted(l)                     #给这组数排序
while l[-2]!=0:                 #下面仔细讲讲吧,防止遗忘
    if 0 in l:
        l.pop(l.index(0))
    l.insert(0,max(l)%min(l))
    l.pop(l.index(max(l)))
print(l[-1])

辗转相除法百科:欧几里得算法_百度百科

之前求两个数的辗转相除法:辗转相除法的一种python实现_lofain的博客-CSDN博客_python辗转相除法

个人理解的辗转相除法的核心其实就是把一个数看作是n个最大公约数的倍数,通过求余的方式一步步把倍数缩小,当不能再缩小倍数时,就得到了最大公约数。

一组数和两个数核心思想是通用的,只不过需要缩小这组数里所有的数。具体方法如下:python怎么将转换列表里的负数,转换为正数-Python-CSDN问答

1.把最大的数对最小数求余(原因是最小数是离最大公约数最近的那个数)

2.把余数加到列表,去掉最大数(相当于用这次运算的余数替代最大数)

3.重复上两个步骤就行了,不过在程序中实现需要去掉0防止对0求余报错

21,30,12,24 这组数的计算过程是这样的

 对倒数第二个数进行检测,为零的时候表示已经计算完成了,最后一个数求是要求的最大公约数。

其实想写一下数学推导过程的,但是想到自己写得并不严谨所以还是算了吧。

如果要对负数求最大公约数的话,可以遍历列表,把负数替换为正数,可以参照这篇:python怎么将转换列表里的负数,转换为正数-Python-CSDN问答z

要求最小公倍数的话,就加上这些代码,并且把基础代码第二行取消注释:

d=l[-1]
for i in l1:
    d=d*(i/l[-1])
print(d)

最后加上计算结果:

请输入一组数
21,30,15,24
3
请输入一组数
1,1,1,1,1,1,1,1,1
1
请输入一组数
0,0,0,0,0
0
请输入一组数
4,16,20,256,800,1024
4
请输入一组数
4334,4134,654,39321,380148,4834914894
1
请输入一组数
90,80
10

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/870210.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号