Ministério da Educação
Brasil um país de todos
Personal tools
You are here: Home Members Marcelo Gama da Silva Matemática Discreta - 2011.2 mdc2.py
Navigation
Log in


Forgot your password?
 
Document Actions

mdc2.py

by Marcelo Gama da Silva last modified 2011-12-08 23:53

Click here to get the file

Size 9.4 kB - File type text/python-source

File contents

import time

# ----------------------------------------------------------------------
# CALCULO DO MDC DE DOIS INTEIROS (a e b) DE MODO RECURSIVO
# ----------------------------------------------------------------------
# Sera utilizada a propriedade: mdc(a,b) = mdc(b,r), quando a = b.q + r
# Sua utilidade pode ser justificada quando |r| < |b|, pois em mdc(b,r)
# estaremos utilizando valores menores que em mdc(a,b)
# ----------------------------------------------------------------------



# ----------------------------------------------------------------------
# FUNCAO MDC1 - TOMAREMOS r COMO SENDO O RESTO DA DIVISAO DE a POR b
# ----------------------------------------------------------------------

def mdc1(a,b):      # Nome da funcao e parametros (a,b)
    if a<0: a = -a  # Tornar a nao-negativo
    if b<0: b = -b  # Tornar b nao-negativo

    if a<b:         # Garantir que a>=b. Nao ocorrendo isso, trocar os valores
        temp = a    # Armazenar temporariamente o menor valor (a)
        a = b       # Atribuir ao a o maior valor (b)
        b = temp    # Recuperar o menor valor (temp) e coloca-lo em b
        
    # ------------------------------------------------------------------
    # Caso base da recursao
    if b==0:        # Verificar se b=0 para usar a propriedade:
        return a    # mdc(a,0) = a (quando a>0)
    # ------------------------------------------------------------------
    # Processo recursivo
    else:                  # Caso b nao seja zero (b!=0)
        return mdc1(b,a%b) # Propriedade a = b.q + r (em python, r = a%b)
    
# **********************************************************************




# ----------------------------------------------------------------------
# FUNCAO MDC2 - TOMAREMOS r COMO SENDO O RESTO DA DIVISAO DE a POR b
# Funcao identica a anterior, mas que mostra os valores de (a,b,r)
# a cada iteracao
# ----------------------------------------------------------------------

def mdc2(a,b):      # Nome da funcao e parametros (a,b)
    if a<0: a = -a  # Tornar a nao-negativo
    if b<0: b = -b  # Tornar b nao-negativo

    if a<b:         # Garantir que a>=b. Nao ocorrendo isso, trocar os valores
        temp = a    # Armazenar temporariamente o menor valor (a)
        a = b       # Atribuir ao a o maior valor (b)
        b = temp    # Recuperar o menor valor (temp) e coloca-lo em b
        
    # ------------------------------------------------------------------
    # Caso base da recursao
    if b==0:        # Verificar se b=0 para usar a propriedade:
        print a     # Mostra o valor do mdc
        return a    # mdc(a,0) = a (quando a>0)
    # ------------------------------------------------------------------
    # Processo recursivo
    else:                  # Caso b nao seja zero (b!=0)
        print a,b,a%b      # Mostrar os valores de a,b,r
        return mdc2(b,a%b) # Propriedade a = b.q + r (em python, r = a%b)
    
# **********************************************************************



# ----------------------------------------------------------------------
# FUNCAO MDC3 - TOMAREMOS r COMO SENDO O MENOR INTEIRO, EM MODULO, QUE
# SATISFAZ A IGUALDADE a = b.q + r
# Funcao identica a anterior, mas que mostra os valores de (a,b,r)
# a cada iteracao
# ----------------------------------------------------------------------

def mdc3(a,b):      # Nome da funcao e parametros (a,b)
    if a<0: a = -a  # Tornar a nao-negativo
    if b<0: b = -b  # Tornar b nao-negativo

    if a<b:         # Garantir que a>=b. Nao ocorrendo isso, trocar os valores
        temp = a    # Armazenar temporariamente o menor valor (a)
        a = b       # Atribuir ao a o maior valor (b)
        b = temp    # Recuperar o menor valor (temp) e coloca-lo em b
        
    # ------------------------------------------------------------------
    # Caso base da recursao
    if b==0:        # Verificar se b=0 para usar a propriedade:
        print a     # Mostra o valor do mdc
        return a    # mdc(a,0) = a (quando a>0)
    # ------------------------------------------------------------------
    # Processo recursivo
    else:                        # Caso b nao seja zero (b!=0)
        if a%b <= b/2:           # Nada muda quando r <= b/2
            print a,b,a%b        # Mostrar os valores de a,b,r
            return mdc3(b,a%b)   # Propriedade a = b.q + r (Nesse caso, r= a%b)
        else:                    # Agora o caso r > b/2
            print a,b,a%b-b      # Mostrar os valores de a,b,r-b
            return mdc3(b,a%b-b) # Propriedade a = b.q + r (Agora r= a%b-b)
    
# **********************************************************************




# ======================================================================
# Imprimir texto centralizado em uma linha
# "Tipo" serao os caracteres que completarao a linha
# (Funcao auxiliar)
# ======================================================================
def cprint(s,tamlinha,tipo): # tipo eh quaquer caractere
    esq = (tamlinha-len(s))/2
    dir = tamlinha-esq-len(s)
    temp = ''
    for i in range(esq-2): temp += tipo
    print temp,
    print ' '+s+' ',
    temp = ''
    for i in range(dir-2): temp += tipo
    print temp    
# ----------------------------------------------------------------------




# ======================================================================
# Verificar se uma string representa um inteiro
# (Funcao auxiliar)
# ======================================================================
def isint(s):
    try: 
        int(s)
        return True
    except ValueError:
        return False
# ----------------------------------------------------------------------




# ======================================================================
# Menu principal
# ======================================================================
def menu():
    linhadupla = ''
    linhasimples =''
    for i in range(70):
        linhadupla += '='
        linhasimples +='-'
    print
    print linhadupla
    cprint("MAXIMO DIVISOR COMUM",70,"=")
    print linhadupla
    print
    print 'Escolha uma opcao:'
    print linhasimples
    print '0 -> Encerrar o programa'
    print '1 -> Calcular o MDC pelo algoritmo euclideano simples'
    print '2 -> Calcular o MDC utilizando menores restos absolutos'
    print linhasimples
    return raw_input('Opcao: ')
# ----------------------------------------------------------------------



# ======================================================================
# Menu operacoes
# ======================================================================
def operacoes(opcao):
    linhadupla = ''
    for i in range(70): linhadupla += '='
    print linhadupla
    # ------------------------------------------------------------------
    if opcao==1:
        cprint("Calculo de mdc(a,b) pelo algoritmo euclideano simples",70,"=")
        print linhadupla
        print
        while True:
            a = raw_input('Informe o valor de a: ')
            if isint(a): break
            else:
                print
                print 'O valor de "a" deve ser inteiro'

        print
        while True:
            b = raw_input('Informe o valor de b: ')
            if isint(b): break
            else:
                print
                print 'O valor de "b" deve ser inteiro'


        linhasimples =''
        for i in range(70): linhasimples +='-'


        print
        print
        print linhasimples
        cprint("mdc utilizando o algoritmo euclideano simples",70," ")
        cprint("Sequencia: a - b - resto",70," ")
        print linhasimples
        mdc2(int(a),int(b))
        print linhasimples
        print 'mdc({0} , {1}) = {2}'.format(a,b,mdc1(int(a),int(b)))
        print linhasimples
    # ------------------------------------------------------------------
    if opcao==2:
        cprint("Calculo de mdc(a,b) utilizando menores restos absolutos",70,"=")
        print linhadupla
        print
        while True:
            a = raw_input('Informe o valor de a: ')
            if isint(a): break
            else:
                print
                print 'O valor de "a" deve ser inteiro'

        print
        while True:
            b = raw_input('Informe o valor de b: ')
            if isint(b): break
            else:
                print
                print 'O valor de "b" deve ser inteiro'


        linhasimples =''
        for i in range(70): linhasimples +='-'


        print
        print
        print linhasimples
        cprint("mdc utilizando menores restos absolutos",70," ")
        cprint("Sequencia: a - b - 'resto' ",70," ")
        print linhasimples
        mdc3(int(a),int(b))
        print linhasimples
        print 'mdc({0} , {1}) = {2}'.format(a,b,mdc1(int(a),int(b)))
        print linhasimples        
# ----------------------------------------------------------------------




# ======================================================================
# Execucao
# ======================================================================
while True:
    opcao = ''
    while not(opcao in ['0','1','2']):
        for i in range(5): print
        opcao = menu()
    if int(opcao)==0:
        break
    else:
        print
        operacoes(int(opcao))
        print
        print 'Reiniciando: ',
        for i in range(28):
            print '.',
            time.sleep(0.2)


Powered by Plone CMS, the Open Source Content Management System

This site conforms to the following standards: