Dúvida em código para cálcular MDC( k números)

93 views
Skip to first unread message

Augusto Santos

unread,
May 7, 2020, 8:40:30 AM5/7/20
to Python Brasil
Boa noite,

Sou novo em programação Python e estou desenvolvendo com a IDE Pycharm no Windows 10.
Estou fazendo exercícios de programação e estou em dúvida de como resolver o exercício que vou descrever a seguir. 
Gostaria de pedir ajuda aos mais experientes na linguagem.

O programa recebe n números na entrada e calcula o mdc. Porém começa a dar problema com n > 3, ou seja, quando a  quantidade de números na entrada é maior que 3. Meu print da main() sempre vem 1.

Não sei o que fazer com a variável "mdc_atual = 1"

Alguém poderia me ajudar por favor?

def mdc(num1, num2):

i = 2
mdc_atual = 1

while i < num1 and i < num2:
while num1 % i == 0 and num2 % i == 0:
mdc_atual = mdc_atual * i
num1 = num1 // i
num2 = num2 // i
i = i + 1

return mdc_atual


qtd_num = int(input("Entre com a quantidade de números: "))
cont = 1
recebe_mdc = 0

recebe_mdc = int(input("Entre com o 1º número:: "))

while cont < qtd_num: #step into
num = int(input('Entre com o {}º número: '.format(cont+1))) #step over
recebe_mdc = mdc(recebe_mdc, num)
cont = cont + 1

print('O mdc é {}'.format(recebe_mdc))

Professor Paiva

unread,
May 7, 2020, 9:53:25 AM5/7/20
to python...@googlegroups.com
Caro Augusto,

Fiz um programinha aqui que resolve o seu problema. O MDC é calculado sempre em pares de 2 números. Usei funções para simplificar o código.

 Ele pode ficar mais simples com o uso de recursividade, mas deixo para outra versão futura. 

O programa é este:

numeros = []
mdcs = []

def maior (x,y):
    if x >= y:
       max = x
    else:
       max = y
    return max

def menor (x,y):
    if x <= y:
       min = x
    else:
       min = y
    return min


def mdc (num1,num2):         #Função MDC para 2 números - Algorimo Euclides
   n1=maior(num1,num2)       #Pega o maior entre num1 e num2
   n2=menor(num1,num2)       #Pega o menor entre num1 e num2
   restodiv  = n1 % n2  
   while restodiv != 0:
         n1 = n2
         n2 = restodiv
         restodiv = n1 % n2
   return n2


n = 1
while n < 2:
    n = int(input ("Quantos números para calcular MDC (mínimo de dois: "))

cont = 1
while cont <= n:
   num = int(input ("Número para calcular MDC: "))
   numeros.append(num)                  

   cont = cont + 1

numerosbkp = numeros

while len(numeros) > 1:
      for i in range (len(numeros)-1):
          mdcs.append(mdc ( numeros[i],numeros [i+1]))
      if len(mdcs) > 1:
         numeros = mdcs
         mdcs = []
      else:
         break

print ("Os números digitados: ")
for i in numerosbkp:
   print (i)
   
print ("Tem MDC: ", mdcs [0])

Se você puder divulgar minha playlist de Introdução à Programação no Youtube, ficarei grato:


Qualquer dúvida, estou à disposição.

Professor Paiva


--
--
------------------------------------
Grupo Python-Brasil
https://wiki.python.org.br/AntesDePerguntar
 
<*> Para visitar o site do grupo na web, acesse:
http://groups.google.com/group/python-brasil
 
<*> Para sair deste grupo, envie um e-mail para:
python-brasi...@googlegroups.com
---
Você recebeu essa mensagem porque está inscrito no grupo "Python Brasil" dos Grupos do Google.
Para cancelar inscrição nesse grupo e parar de receber e-mails dele, envie um e-mail para python-brasi...@googlegroups.com.
Para ver essa discussão na Web, acesse https://groups.google.com/d/msgid/python-brasil/5e5d0b5c-7a31-48a1-9531-584ccca5d234%40googlegroups.com.

Professor Paiva

unread,
May 7, 2020, 4:11:50 PM5/7/20
to python...@googlegroups.com
Augusto,

Pra dar mais facilidade, o programa MDCs multiplos.py 

Em qui., 7 de mai. de 2020 às 09:40, Augusto Santos <gutosan...@gmail.com> escreveu:
--
MDCs multiplos.py

Augusto Santos

unread,
May 7, 2020, 6:41:56 PM5/7/20
to Python Brasil
Boa noite. 

Muito obrigado pela atenção e ajuda. 
Na verdade, eu queria seguir na linha de raciocínio da função. 
Queria saber como poderia fazer com que a variável mdc_atual = 1 não retornasse após o terceiro número como 1. 

De qualquer forma agradeço novamente. 

---
Você recebeu essa mensagem porque está inscrito no grupo "Python Brasil" dos Grupos do Google.
Para cancelar inscrição nesse grupo e parar de receber e-mails dele, envie um e-mail para python...@googlegroups.com.

Professor Paiva

unread,
May 7, 2020, 7:10:48 PM5/7/20
to python...@googlegroups.com
Entenda essa lógica aí e aperfeiçoe a sua. Programação é assim mesmo. Cada um tem seu jeito, embora alguns caminhos não levam a nada.

Boa sorte 

Paiva

Enviado do meu iPhone

Em 7 de mai de 2020, à(s) 19:42, Augusto Santos <gutosan...@gmail.com> escreveu:



---
Você recebeu essa mensagem porque está inscrito no grupo "Python Brasil" dos Grupos do Google.
Para cancelar inscrição nesse grupo e parar de receber e-mails dele, envie um e-mail para python-brasi...@googlegroups.com.
Para ver essa discussão na Web, acesse https://groups.google.com/d/msgid/python-brasil/b3f2a786-c824-4137-b08d-ee6c424c4621%40googlegroups.com.

Erik D San

unread,
May 8, 2020, 1:33:31 PM5/8/20
to Python Brasil
Olá! Por favor, verifica se esse módulo pode ajudá-lo:
https://github.com/erikssonsantos/desafios_aleatorios/blob/master/mmc_mdc.py
Da linha 99 em diante tem as duas funções, mmc() e mdc(): ambas recebem como parâmetro uma lista de inteiros e retorna o MMC ou o MDC.
Não testei muito, pode ter bugs. Fique a vontade para usar como referência.

Erik D San

unread,
May 8, 2020, 2:39:25 PM5/8/20
to Python Brasil
Percebi agora que a função mdc() que criei tá errada,... vou dar uma corrigida.

Professor Paiva

unread,
May 8, 2020, 5:07:23 PM5/8/20
to python...@googlegroups.com
Erick veja também a performance do seu código! Além de errado parece ineficiente!

Enviado do meu iPhone

Em 8 de mai de 2020, à(s) 15:39, Erik D San <arqu...@gmail.com> escreveu:


--
--
------------------------------------
Grupo Python-Brasil
https://wiki.python.org.br/AntesDePerguntar
 
<*> Para visitar o site do grupo na web, acesse:
http://groups.google.com/group/python-brasil
 
<*> Para sair deste grupo, envie um e-mail para:
python-brasi...@googlegroups.com
---
Você recebeu essa mensagem porque está inscrito no grupo "Python Brasil" dos Grupos do Google.
Para cancelar inscrição nesse grupo e parar de receber e-mails dele, envie um e-mail para python-brasi...@googlegroups.com.

Daniel Chaves de Lima

unread,
May 8, 2020, 9:50:47 PM5/8/20
to Python Brasil
Minha sugetão de script é:
numeros = []

def mdc_euclides(numeros:list):
    a = numeros[0]
    for i in range(1, len(numeros)):
        b = numeros[i]

        if a >= b:
            dividendo = a
            divisor = b
        else:
            dividendo = b
            divisor = a

        resto = dividendo % divisor
        while resto != 0:
            dividendo = divisor
            divisor = resto
            resto = dividendo % divisor
        a = divisor
    return a

while True:
    entrada = input('digite um numero inteiro ou "s" pra sair: ')
    if entrada. upper() != "S":
        try:
            numeros.append(int(entrada))
        except ValueError:
            print("digite um valor inteiro!!")
    else:
        break

if len(numeros) >= 2:
    mdc = mdc_euclides(numeros)
    print("O mdc de", end=" ")
    for numero in numeros[:-1]:
        print(numero, end=", ")
    print(numeros[-1], "é", mdc)
else:
    print("Você deveria ter digitado mais de um número")


só não comentei as operações feitas mas creio que entenderá, pos utilizei o algoritmo de euclides recursivamente.

Linux - Junior Polegato

unread,
May 11, 2020, 12:46:13 PM5/11/20
to python...@googlegroups.com
Olá!

        Pelo algoritmo de Euclides, o MDC entre dois números a e b pode ser dado por: a se b for zero, senão  será o MDC entre b e resto de a por b

        mdc = lambda a, b: a if b == 0 else mdc(b, a % b)

        Com Python, você pode pedir para digitar vários números separados por espaço e então fazer um split:

        números = input("Digite os números para calcular o MDC entre eles: ").split()

        Por fim podemos usar reduce, que aplica uma função entre os dois primeiros de uma lista e depois vai aplicando a função com o resultado e cada um dos próximos, ressaltando que devemos mapear para inteiro a lista de números:

        import functools
        functools.reduce(mdc, map(int, números))

        Pronto, feito em 4 linhas de código.
-- 

[]'s

Junior Polegato

Erik D San

unread,
May 11, 2020, 5:57:09 PM5/11/20
to Python Brasil
Agora tá correto. Basta colocar uma lista de inteiros que ele retorna o MDC.
https://github.com/erikssonsantos/desafios_aleatorios/blob/master/mmc_mdc.py

---
Você recebeu essa mensagem porque está inscrito no grupo "Python Brasil" dos Grupos do Google.
Para cancelar inscrição nesse grupo e parar de receber e-mails dele, envie um e-mail para python...@googlegroups.com.

Linux - Junior Polegato

unread,
May 12, 2020, 8:17:49 AM5/12/20
to python...@googlegroups.com
Em tempo, a última linha melhor seria:

print("MDC:", functools.reduce(mdc, map(int, números)))
Reply all
Reply to author
Forward
0 new messages