LCM和GCD 3号码 - Python

时间:2017-02-28 19:38:43

标签: python python-3.x python-3.5 greatest-common-divisor lcm

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

mprintf

我的问题是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):
            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)))

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

2 个答案:

答案 0 :(得分:1)

<强>分析

正如您刚刚发现(但尚未实现),对于整数对的关系:

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

答案 1 :(得分: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

  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迭代并使用gcd()模块中的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函数并使用reduce()模块中的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)

无论哪种方式,收益都是相同的。使用此简单功能,您可以计算所需的所有数字的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

我希望它能对我有帮助。