O maior divisor comum (MDC, ou GCD em inglês) de a e b é o maior número que divide ambos sem sobrar resto.
Um modo de encontrar o MDC de dois números é observar qual é o resto r quando a é dividido por b, verificando que gcd(a, b) = gcd(b, r). Como caso-base, podemos usar gcd(a, 0) = a.
Escreva uma função chamada gcd que receba os parâmetros a e b e devolva o maior divisor comum, consegui fazer mas toda vez que eu vou exibir o valor de “a” e “b” que eu escolhi me é retornado os novos valores dessas variáveis. segue o código:
#Exercício 6.5
def gdc(a, b):
if a > b:
d = a - b
h = b%d
if h != 0:
gdc(b, d)
elif h == 0:
print("o gdc entre {} e {} dá {} ".format(a, b, d))
else:
print("deu zebra")
gdc(48, 30)
em vez de printar “o gdc entre 48 e 30 dá 6
”, ele exibe "o gdc entre 18 e 12 dá 6
", sendo 18 e 12 os últimos 2 números utilizados nessa função. já tentei de varias modos, mas no geral sempre caio nesse erro ou em uma recursividade infinita…
o que quero é que seja exibido o valor inicial da variável, o a = 48 e b = 30 que foram inseridos para chamar a função.
Alguém pode me ajudar a resolver isso de modo que fique semelhante ao que eu estou tentando fazer?
Já tentei usar a e b como variáveis globais mas como nunca tinha tentado isso, não deu certo.
Oi @alessandra1408.
Quando postar código aqui, utilize as tags pra código, que fica mais fácil entender o que você fez.
O problema é que como a funçao gcd chama ela mesmo múltiplas vezes para chegar ao resultado, quando você chega na parte final onde tem resultado, nao existe mais disponível nas variáveis o valor inicial.
Uma opçao é ao invés de deixar o comando print
dentro da funçao, deixe ele fora. Isso é o mais recomendado. Você ter uma funçao que só calcula o valor e outra que exibe o resultado.
#ao invés de:
print("o gdc entre {} e {} dá {} ".format(a, b, d))
#use
return d
#ao invés de:
gdc(b, d)
#use
return gdc(b, d)
# a parte do else você pode remover pois nunca vai entrar ali.
# e fora da funçao você chama:
print("o gdc entre {} e {} dá {} ".format(a, b, gdc(a,b) ))
1 curtida
Entendi o que você falou, muito obrigada! Faz sentido. Mas, quando eu fui tentar ele diz que não está definido. Eu posso tentar fazer com que a e b sejam globais, mas daí eu não vou conseguir usar gdc com os argumentos a e b, e a função ficando sem argumentos eu n posso chamar dnv no “gdc(b,d)”.
O que eu faço
@alessandra1408
Boa noite amiga.
Escrevi um código para resolver o problema, porém não sei dizer se é a melhor solução.
def gdc(a, b):
lista = []
mmc = []
saida = 0
for q in range(0, 2):
n = a if q == 0 else b
d = 2
r = n
valores = []
while r > 1:
if r % d == 0:
r = r/d
valores.append(d)
else:
d += 1
lista.append(valores)
for n in lista[0]:
if n in lista[1] and n not in mmc:
mmc.append(n)
for n in mmc:
saida = saida * n if saida > 0 else n
return "O gdc entre {} e {} da {} ".format(a, b, saida)
print(gdc(48,30))
Espero que ajude.
Muito obrigada pela ajuda, de verdade mesmo, mas eu to começando agora com python e não entendi muito bem o reu código. To tentando fazer algo mais fácil.
Vou seguir tentando e quem sabe eu entenda teu código!
Boa tarde…kkkkkkkkkk…entendi qual o seu problema com o meu e o seu código e esqueci de explicar…kkkkkkkkk…depois eu edito o código colocando os comentários.
o seu problema de troca de valores acontece pq faz a recursão do método e isso faz a troca dos valores.
o meu código faz a decomposição dos valores com o MMC, encontra os divisores comuns com o menor expoente, multiplica os valores entre eles e devolve dentro da variável de saída.
1 curtida
Heheheh, obrigada pq eu acho que eu nunca iria entender e.e
Ps: n sei como por em formato de código aqui, mas enfim hehe.
Acho que realmente desse jeito meu n vai funcionar ksk. Mas segue o que eu fiz agr
a = 0
b = 0
Def gdc(a, b):
if a > b:
d = a - b
h = b%d
if h != 0:
return gdc(b, d)
elif h == 0:
return d
else:
print(“deu zebra”)
gdc(48,30)
print(“o gdc entre {} e {} deu {}”.format(a, b, gdc(a, b)))
Fiz a e b = 0 pra o print fora da função poder chamar essas variáveis, pq n tava dando antes. Mas agora ele retorna no print 0,0 e None pq ele n ta pegando os valores “novos” de a, e sim os que eu passei antes de fazer a função.
O que eu faço ksksk
def gcd (a, b):
if b == 0: # caso base
return a
return gcd(b, a % b) # gcd(a,b) = gcd(b, r), onde r = a % b
1 curtida