Foro de elhacker.net

Programación => Scripting => Mensaje iniciado por: reconFito en 19 Diciembre 2019, 09:02 am



Título: ¿Cómo lo puedo hacer más eficiente?
Publicado por: reconFito en 19 Diciembre 2019, 09:02 am
Siento que sea algo extenso, si alguno me diera alguna idea de como hacerlo más eficiente se aceptan sugerencias.Gracias

Código
  1. # Ejercicio#129 Máximo común divisor
  2.  
  3.    # Lista que contendra los valores divisores == 0
  4.    # para luego de esta lista sacar el maximo de todos.
  5.    maximo_divisor = []
  6.  
  7.    # Pedir datos al usuario
  8.    a = int(input("Digita el primer dato: "))
  9.    b = int(input("Digita el segundo dato: "))
  10.    if 0 > (a or b):
  11.        print("Error al interpretar")
  12.    else:
  13.        if a < b:
  14.            for i in range(1,a+1):
  15.                divisor_a = a%i
  16.                divisor_b = b%i
  17.                # print(divisor_a, divisor_b)
  18.                if divisor_a != 0 and divisor_b != 0:
  19.                    print(f"El numero {i} no es divisor de {a}")
  20.                else:
  21.                    if divisor_a == 0 and divisor_b == 0:
  22.                        print(f"El número {i} es divisor de {a}")
  23.                        if divisor_a == 0:
  24.                            maximo_divisor.append(i)              
  25.        else:
  26.            for i in range(1,b+1):
  27.                divisor_a = a%i
  28.                divisor_b = b%i
  29.                # print(divisor_a, divisor_b)
  30.                if divisor_a != 0 and divisor_b != 0:
  31.                    print(f"El numero {i} no es divisor de {b}")
  32.                else:
  33.                    if divisor_a == 0 and divisor_b == 0:
  34.                        print(f"El número {i} es divisor de {b}")
  35.                        if divisor_b == 0:
  36.                            maximo_divisor.append(i)
  37.        print()
  38.        print("El maxio común divisor es => {}".format(max(maximo_divisor)))
  39.  


Título: Re: ¿Cómo lo puedo hacer más eficiente?
Publicado por: engel lex en 19 Diciembre 2019, 15:40 pm
hey! cuidado con los operadores

Código
  1. if 0 > (a or b):

le estás diciendo "aplica or entre a y b, luego ver si ese resultado es menor que 0"

es decir si le das a=3 y b=10,  el verá si 11 es menor que 0

lo que queres es

Código
  1. if 0 > a or 0 > b:

para evitar repetir todo el codigo usa 2 variables extras

menor y mayor

Código
  1. if a==b: print("nope...")
  2. menor = a if a<b else b
  3. mayor = a if a>b else b

el maximo divisor no requiere ser un array, puede ser un entero...

el resto de optimización es matematica...

-revisar si el menor es divisor del mayor, en ese caso termina ahí
-el maximo divisor de un numero jamas será mayor a su mitad
-empezar por el numero mas alto (que es la mitad de el numero menor si es par)
etc...


Título: Re: ¿Cómo lo puedo hacer más eficiente?
Publicado por: tincopasan en 19 Diciembre 2019, 20:43 pm
hola, en python una de las múltiples posibilidades.
Código
  1. #-*- coding: utf -8 -*-
  2.  
  3. num1 = int(input("Digita el primer dato:"))
  4. num2 = int(input("Digita el segundo dato: "))
  5.  
  6. a = max(num1, num2)
  7. b = min(num1, num2)
  8.  
  9. while b!=0:
  10.    res = b
  11.    b = a%b
  12.    a = res
  13.  
  14. print('El M.C.D. entre {0} y {1} es: {2}'.format(num1, num2, res))
  15.  
  16.  
  17.  

Saludos