-1

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

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。任何帮助都会很有用!


新代码感谢 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 个空格。谢谢

4

2 回答 2

2

分析

正如您刚刚发现(但尚未意识到),整数对成立的关系:

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
于 2017-02-28T19:58:28.540 回答
0

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

例如:a , b , c , d的 GCD

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

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

例如:a , b , c , d的 LCM

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

*双斜杠运算符 (//) 用于“地板”除法(向下舍入到最接近的整数)


Python 3 中的 GCD:

因此,首先我们可以通过以下简单的while迭代并使用math模块中的gcd()函数来做到这一点,如下所示:

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函数和使用functools模块中的reduce()函数使其变得更简单,如下所示:

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)

无论哪种方式,回报都是一样的。使用这个简单的函数,您可以计算所有您想要的数字的 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

Python 3 中的 LCM:

按照上面最简单示例的相同原理,要计算两个或多个数字的 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

我希望它有帮助,它对我来说很好。

于 2020-01-08T09:53:11.057 回答