2017-02-28 121 views
-1

这是我的代码到目前为止。LCM和GCD 3编号 - 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 任何帮助将是有益的!


新代码感谢修剪等

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位代码。由于

+5

这不是你的实际代码,或者你没有提到你的错误。 'math.gcd'只有两个参数,所以'a = gcd(x,y,z)'会死于'TypeError'。无论如何,你都过于复杂。只需编写一个双数LCM函数,并且[你可以用它来实现一个'n'数LCM函数](http://stackoverflow.com/q/147515/364696)。 – ShadowRanger

+0

......并且*会因该错误而死亡。 – Prune

回答

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 
+0

加一个正确答案!谢谢 – Bilbo