Test Foro de elhacker.net SMF 2.1

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 (python) [Seleccionar]

# Ejercicio#129 Máximo común divisor

    # Lista que contendra los valores divisores == 0
    # para luego de esta lista sacar el maximo de todos.
    maximo_divisor = []

    # Pedir datos al usuario
    a = int(input("Digita el primer dato: "))
    b = int(input("Digita el segundo dato: "))
    if 0 > (a or b):
        print("Error al interpretar")
    else:
        if a < b:
            for i in range(1,a+1):
                divisor_a = a%i
                divisor_b = b%i
                # print(divisor_a, divisor_b)
                if divisor_a != 0 and divisor_b != 0:
                    print(f"El numero {i} no es divisor de {a}")
                else:
                    if divisor_a == 0 and divisor_b == 0:
                        print(f"El número {i} es divisor de {a}")
                        if divisor_a == 0:
                            maximo_divisor.append(i)               
        else:
            for i in range(1,b+1):
                divisor_a = a%i
                divisor_b = b%i
                # print(divisor_a, divisor_b)
                if divisor_a != 0 and divisor_b != 0:
                    print(f"El numero {i} no es divisor de {b}")
                else:
                    if divisor_a == 0 and divisor_b == 0:
                        print(f"El número {i} es divisor de {b}")
                        if divisor_b == 0:
                            maximo_divisor.append(i)
        print()
        print("El maxio común divisor es => {}".format(max(maximo_divisor)))
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 (python) [Seleccionar]
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 (python) [Seleccionar]
if 0 > a or 0 > b:

para evitar repetir todo el codigo usa 2 variables extras

menor y mayor

Código (python) [Seleccionar]
if a==b: print("nope...")
menor = a if a<b else b
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 (python) [Seleccionar]

#-*- coding: utf -8 -*-

num1 = int(input("Digita el primer dato:"))
num2 = int(input("Digita el segundo dato: "))

a = max(num1, num2)
b = min(num1, num2)

while b!=0:
    res = b
    b = a%b
    a = res

print('El M.C.D. entre {0} y {1} es: {2}'.format(num1, num2, res))




Saludos