Python求一组数字的最大公约数和最小公倍数

一、先来看求最大公约数

1)、利用gcd函数

math库里面有个gcd函数能直接求出两个数字的最大公约数,遇到求一组数字的最大公约数的时候,加一个循环就好,如下:

import math
def gcd_many(s):
    g = 0
    for i in range(len(s)):
        if i == 0:
            g = s[i]
        else:
            g=math.gcd(g,s[i])

    return g

s = list(map(int,input().split()))
print(gcd_many(s))

看输入输出:

输入:4 8 12 24 48
输出:4
2)、不使用库函数里面的gcd函数

不用gcd函数的话,我们就自己写一个求两个数最大公约数的函数,如下:

def gcd_2(a,b):		#求两个数的最大公约数
    a,b = max(a,b),min(a,b)
    if a%b == 0:
        return b
    else:
        return gcd_2(b,a%b)

def gcd_many(s):		#求全部的
    g = 0
    for i in range(len(s)):
        if i == 0:
            g = s[i]
        else:
            g=gcd_2(g,s[i])

    return g

s = list(map(int,input().split()))
print(gcd_many(s))

二、求一组数的最小公倍数

求最小公倍数没有捷径可走,我们知道小时候学的“短除法”求最小公倍数,就是将两个数所有的约数,乘到一起再乘以下面的两个数字,如图:
在这里插入图片描述
最小公倍数就是 2 ∗ 2 ∗ 3 ∗ 4 2*2*3*4 2234,所以只要求出最大公约数,在乘上每个数除以最大公约数的值即可。

不废话了,上代码:

import math
s = list(map(int,input().split()))
def gbs(s):
    a,b = s[0],s[1]
    a = a // math.gcd(a, b) * b // math.gcd(a, b) * math.gcd(a, b)
    if len(s)>2:
        for i in range(2,len(s)):
            b = s[i]
            a = a//math.gcd(a,b) * b//math.gcd(a,b) * math.gcd(a, b)
    return a

print(gbs(s))

看输入输出:

输入:10 16 4
输出:80

小白欢迎指点~

### Python 实现递归最大公约数最小公倍数 以下是基于递归方法实现的最大公约数GCD最小公倍数(LCM)的 Python 函数: #### 最大公约数GCD) 欧几里得算法是一种经典的递归方法用于计算两个整数的最大公约数。其核心思想是反复利用余数运算,直到其中一个参数变为零。 ```python def RecursiveGcd(x, y): if y == 0: return x else: return RecursiveGcd(y, x % y) ``` 上述代码实现了递归版本的 GCD 计算逻辑[^1]。当 `y` 变为零时,返回当前的 `x` 值作为结果;否则继续调用自身并传入 `(y, x % y)` 参数组合。 #### 最小公倍数(LCM) 最小公倍数可以通过以下公式与最大公约数关联起来: \[ \text{lcm}(x, y) = \frac{|x \cdot y|}{\text{gcd}(x, y)} \] 因此,在已知递归版 GCD 的基础上可以轻松定义 LCM 函数如下所示: ```python def computeLcmWithRecursiveGcd(x, y): lcm = abs(x * y) // RecursiveGcd(x, y) return lcm ``` 此部分代码展示了如何通过调用先前定义好的递归 GCD 方法来完成 LCM 的计算过程[^3]。 综合以上两部分内容,完整的程序结构应如下所列: ```python def RecursiveGcd(x, y): if y == 0: return x else: return RecursiveGcd(y, x % y) def computeLcmWithRecursiveGcd(x, y): lcm = abs(x * y) // RecursiveGcd(x, y) return lcm # 输入测试数据 if __name__ == "__main__": a = int(input()) b = int(input()) # 输出结果 print(computeLcmWithRecursiveGcd(a, b)) ``` 该脚本首先接收用户输入的一对正整数值,随后打印它们对应的最小公倍数。 --- 问题
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值