2017-02-28 3 views
-1

Ceci est mon code jusqu'à présent.Numéro LCM et 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))) 

Mon problème est que le 3 chiffres trouve juste un petit commun multiple pas les 8 plus bas un 10, 5, fait 400 au lieu d'un possible 40. Toute aide serait utile!


Nouveau code Merci Tailler

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

Une autre chose, est-il une autre façon de marquer le code au lieu d'avoir à ajouter 4 places avant chaque ligne. Merci

+5

Ce n'est pas votre code actuel, ou vous omettez de mentionner vos erreurs. 'math.gcd' ne prend que deux arguments, donc' a = gcd (x, y, z) 'mourrait avec un' TypeError'. En tout cas, vous compliquez les choses. Il suffit d'écrire une fonction LCM à deux chiffres, et [vous pouvez l'utiliser pour implémenter une fonction LCM de type 'n' trivialement] (http://stackoverflow.com/q/147515/364696). – ShadowRanger

+0

... et * * meurt avec cette erreur. – Prune

Répondre

1

ANALYSE

Comme vous venez de découvrir (mais pas encore réalisé), la relation qui détient pour les paires d'entiers:

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

ne pas tenir pour triples. La logique de base pour la factorisation en nombres premiers est que la GCD prend l'exposant minimum pour chaque facteur premier; l'écran LCD prend l'exposant maximum. Avec seulement deux entiers, cela signifie que chaque exposant est utilisé exactement une fois, ce qui permet à l'équation ci-dessus de tenir. Cependant, avec trois entiers, vous garantissez que l'exposant du milieu pour chaque facteur premier sera exclu des calculs LCM et 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 

Notez les facteurs exclus: 2^1 * 3^0 * 5^1 = 10, ce qui est la raison pour laquelle votre calcul de LCM est élevé par un facteur de 10.


SOLUTION

vous devez diviser la logique lorsque vous employez le troisième entier, quelque chose comme ceci:

# 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 un pour une réponse correcte! Je vous remercie – Bilbo