2017-02-28 117 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