2017-02-28 6 views
-1

Dies ist mein Code bisher.LCM und GCD 3 Nummer - 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))) 

Mein Problem ist, dass die 3-stellige findet nur ein gemeinsames Vielfaches nicht der niedrigste dieser 10, 5, 8 400 anstelle eines möglichen 40. macht Jede Hilfe wäre nützlich sein!


Neuer Code Dank

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))) 

Eine andere Sache zu beschneiden, Gibt es einen anderen Weg, um Code zu markieren, anstatt 4 Räume in vor jeder Zeile hinzufügen zu müssen. Dank

+5

Dies ist nicht Ihr tatsächlicher Code, oder Sie erwähnen Ihre Fehler nicht. 'math.gcd' nimmt nur zwei Argumente, also würde 'a = gcd (x, y, z)' mit 'TypeError' absterben. In jedem Fall verkomplizieren Sie die Dinge. Schreiben Sie einfach eine LCM-Funktion mit zwei Zahlen und [Sie können damit eine 'n'-Nummer LCM-Funktion trivial implementieren] (http://stackoverflow.com/q/147515/364696). – ShadowRanger

+0

... und * stirbt * mit diesem Fehler. – Prune

Antwort

1

ANALYSE

Wie Sie haben gerade entdeckt, (aber noch nicht realisiert), die Beziehung, die für Paare von ganzen Zahlen gilt:

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

tut nicht halten für Tripel. Die Grundlogik für Primfaktorzerlegung ist, dass die GCD den minimalen Exponenten für jeden Primfaktor annimmt; Das LCD nimmt den maximalen Exponenten. Mit nur zwei ganzen Zahlen bedeutet dies, dass jeder Exponent genau einmal verwendet wird, was die obige Gleichung zulässt.

Mit drei ganzen Zahlen garantieren Sie jedoch, dass der mittlere Exponent für jeden Primfaktor von den LCM- und GCD-Berechnungen ausgeschlossen wird.

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 

Hinweis die ausgeschlossenen Faktoren: 2^1 * 3^0 * 5^1 = 10, weshalb ist Ihre LCM Berechnung um den Faktor 10.


hoch ist LÖSUNG

Sie müssen die Logik teilen, wenn Sie die dritte ganze Zahl ist, so etwas wie dieses verwenden:

# 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

Plus Eins für die richtige Antwort! Vielen Dank – Bilbo