LCM 和 GCD 3 编号 - Python

LCM and GCD 3 Number - Python

到目前为止,这是我的代码。

from math import gcd

#3 digit lcm calculation
h=input("(1) 2 Digit LCM Or \n(2) 3 Digit LCM\n :")
if h == "2":
    while True:
        def lcm(x, y, z):
            a = gcd(x, y, z)
            num = x
            num2 = y * z // a
            LCM = num * num2 // a

            return LCM

        x = int(input("Number 1: "))
        y = int(input("Number 2: "))
        z = int(input("Number 3: "))
        print("The LCM Of " + str(x) + " And " + str(y) + " And " + str(z) +         " Is " + str(lcm(x, y, z)))

if h == "1":
    while True:
        def lcm(x, y):
            a = gcd(x, y)
            num = x
            num2 = y
            LCM = num * num2 // a

            return LCM
        x = int(input("Number 1: "))
        y = int(input("Number 2: "))
        print("The LCM Of " + str(x) + " And " + str(y) + " Is " + str(lcm(x, y)))

我的问题是 3 位数字只是找到一个公倍数,而不是最小的 10 、 5 、 8 使 400 而不是可能的 40。 任何帮助都会有用!


New Code Thanks To Prune

from math import gcd

#3 digit lcm calculation
h=input("(1) 2 Digit LCM Or \n(2) 3 Digit LCM\n :")
if h == "2":
    while True:
        def lcm(x, y, z):
            gcd2 = gcd(y, z)
            gcd3 = gcd(x, gcd2)

            lcm2 = y*z // gcd2
            lcm3 = x*lcm2 // gcd(x, lcm2)
            return lcm3

        x = int(input("Number 1: "))
        y = int(input("Number 2: "))
        z = int(input("Number 3: "))
        print("The LCM Of " + str(x) + " And " + str(y) + " And " + str(z) + " Is " + str(lcm(x, y, z)))

另外一件事,是否有另一种标记代码的方法,而不是必须在每一行之前添加 4 个空格。谢谢

分析

正如您刚刚发现(但尚未意识到)的那样,适用于整数对的关系:

x * y = GCD(x, y) * LCM(x, y)

对三元组成立。质因数分解的基本逻辑是 GCD 对每个质因数取最小指数; LCD 取最大指数。只有两个整数,这意味着每个指数只使用一次,从而使上述等式成立。

但是,对于三个整数,您保证每个素数的中间指数都将从 LCM 和 GCD 计算中排除。

 10 = 2^1 * 3^0 * 5^1
  8 = 2^3 * 3^0 * 5^0
  5 = 2^0 * 3^0 * 5^1
----------------------
GCD = 2^0 * 3^0 * 5^0
LCM = 2^3 * 3^0 * 5^1

注意排除的因素:2^1 * 3^0 * 5^1 = 10,这就是为什么你的 LCM 计算高出 10 倍的原因。


解决方案

使用第三个整数时需要拆分逻辑,像这样:

# Find the 2-number and 3-number GCDs
gcd2 = gcd(y, z)
gcd3 = gcd(x, gcd2)

# Find the 2-number and 3-number LCMs
lcm2 = y*z // gcd2
lcm3 = x*lcm2 // gcd(x, lcm2)

return lcm3

要计算两个以上数字的 GCD,您可以按如下方式计算:

例如:abc、[=60=的GCD ]d

  1. gcd(a, b) = x
  2. gcd(x, c) = y
  3. gcd(y, d) = z

要计算两个以上数字的LCM,您可以按如下方式计算:

例如:abc、[=60=的LCM ]d

  1. a * b // gcd(a, b ) = x
  2. x * c // gcd(x, c ) = y
  3. y * d // gcd(y, d ) = z

*用于 "floor" 除法的双斜杠运算符 (//)(向下舍入到最接近的整数).


GCD 在 Python 3:

所以首先我们可以通过以下简单的 while 迭代和使用 gcd() function from math 模块来完成它,如下所示:

from math import gcd

def gcd_n(*args):
    i = 1
    x = args[0]

    while i < len(args):
        x = gcd(x, args[i])
        i += 1
    return x

也可以使用 lambda function and using reduce() function from functools 模块使其更简单一些,如下所示:

from math import gcd
from functools import reduce

def gcd_n(*args):
    f = lambda a,b:gcd(a,b)
    return reduce(lambda x,y:f(x,y),args)

但是当你认为它不能变得更容易时......是的,它可以变得更容易:

from math import gcd
from functools import reduce

def gcd_n(*args):
    return reduce(gcd, args)

无论哪种方式 return 都是一样的。通过这个简单的函数,你可以计算出你想要的所有数字的GCD,无论它们是2、3、4还是N个数字。

>>> gcd_n(3355, 985)
5
>>> gcd_n(3465, 6615, 7875)
315
>>> gcd_n(6930, 13230, 15760)
10
>>> gcd_n(1750, 1960, 3080)
70
>>> gcd_n(85, 96, 100, 225)
1

LCM Python 3:

遵循上述最简单示例的相同原理,计算两个或多个数字的 LCM,这两个函数就足够了:

from math import gcd
from functools import reduce

def lcm(a, b):
    return a * b // gcd(a, b)

def lcm_n(*args):
    return reduce(lcm, args)

这里有一个样本测试系列:

>>> lcm_n(77, 9)
693
>>> lcm_n(5, 10, 15)
30
>>> lcm_n(62, 89, 13)
71734
>>> lcm_n(21, 4, 17, 2)
1428

希望对你有帮助,对我来说效果很好。