[python] Otra mejora al programa de múltiplos y divisores

Ya era hora de volver por aquí ¿no? Hoy traigo una nueva mejora al programa de la anterior entrada

En esta ocasión he añadido un bucle para que vuelva a pedirte las opciones una vez se termine el programa y además, la posibilidad de calcular el mínimo común múltiplo o máximo común divisor de dos números. A continuación tenéis el código…

#!/usr/bin/python
# coding=utf-8
from __future__ import print_function
import math
from fractions import gcd

def mcd(num1, num2):
    a = max(num1, num2)
    b = min(num1, num2)
    while b!=0:
        mcd = b
        b = a%b
        a = mcd
    return int(mcd)
 
""" Funcion para hallar el Minimo Comun Multiplo """
def mcm(num1, num2):
    a = max(num1, num2)
    b = min(num1, num2)
    mcm = (a / mcd(a, b)) * b
    return int(mcm)
 
opcion = 10
while opcion != 0 :
    print ("Dime qué quieres comprobar:")
    print ("1 - múltiplos de un número")
    print ("2 - divisores de un número")
    print ("3 - mínimo común múltiplo de dos números")
    print ("4 - máximo común divisor de dos números")
    print ("0 - salir")
    opcion = int(input("Pulsa la tecla de la opción que quieras: (1/2/3/4/0) "))
    print ("Has elegido la opcion", opcion)
    
    #Evaluamos la opción elegida
    if (opcion > 4):
        #La opción elegida es incorrecta
        print("¡ERROR!: ¡Tienes que elegir una de las opciones!")
    elif (opcion == 1):
        '''
            La opción elegida es la 1. 
            Vamos a calcular los n primeros múltiplos de un número
            Ahora tenemos que solicitar el número y cuántos múltiplos hay que calcular
        '''
        numero= int(input("Dime el número del que quieres encontrar los múltiplos: "))
        multiplos  = int(input("Dime cuántos múltiplos quieres: "))
        #Desde 0 hasta el número de múltiplos solicitado...
        for i in range (0, multiplos):
            # Multiplicamos el número del que queremos los múltiplos por i
            print (numero*i, ' ', end='')
        print()
        print("")
    elif (opcion == 2):
        '''
            La opción elegida es la 2
            Vamos a calcular los divisores de un número 
            dividiendo por cada número desde 1 hasta el número dado
        '''
        numero = int(input("Escribe un número entero mayor que cero: "))
        if numero <= 0:
            #Error: El número que se ha introducido es 0 o menor
            print("¡ERROR!: ¡Te he pedido un número entero mayor que cero!")
        else:
            print('Los divisores de', numero, 'son: ', end='')
            #Desde 1 hasta el número, si la división da de resto 0 es un divisor
            for i in range(1, numero + 1):
                if numero % i == 0:
                    print(i, ' ', end='')
            print()
        print("")
    elif (opcion == 3):
        # Pedimos los datos al usuario
        num1 = int(input("Introduce el primer numero\n"))
        num2 = int(input("Introduce el segundo numero\n"))
        # Mostramos el resultado en pantalla
        print(("El m.c.m. entre "+str(num1)+" y "+str(num2)+" es: "+str(mcm(num1, num2))))
        print("")
    elif (opcion == 4):
        # Pedimos los datos al usuario
        num1 = int(input("Introduce el primer numero\n"))
        num2 = int(input("Introduce el segundo numero\n"))
        # Mostramos el resultado en pantalla
        print(("El m.c.d. entre "+str(num1)+" y "+str(num2)+" es: "+str(mcd(num1, num2))))
        print("")
    else:
        print ("Hasta pronto")

Espero que os resulte interesante.

Hay muchos aspectos a mejorar. Por ejemplo no hago control de entrada

opcion = int(input("Pulsa la tecla de la opción que quieras: (1/2/3/4/0) "))

de forma que si en lugar de un número se pulsa una letra el programa falla.

Otro aspecto a mejorar sería el poder elegir más de dos números para buscar el mcm. A la hora de comprobar un resultado de un ejercicio sería muy práctico.

Para la próxima entrada, pondré un ejemplo de lectura de un csv con valores separados por punto y coma (;) y la generación de un pdf a partir de esos datos.

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *

Este sitio usa Akismet para reducir el spam. Aprende cómo se procesan los datos de tus comentarios.