MAC2166 - Introdução à Computação

06/04/2017 - Aula 8 - REVISÃO PARA A P1

Problema 8.1

Dizemos que um número inteiro positivo é triangular se ele é o produto de três numeros inteiros consecutivos. Por exemplo, 120 é triangular, pois 4 * 5 * 6 = 120.

Dado um número inteiro positivo n, verificar se n é triangular.

Obs.: Esse exercício corresponde ao 10 da lista sobre inteiros .

Solução

In [1]:
def main():
    '''
    Programa que le um inteiro positivo n e imprime uma mensagem
    indicando se ele eh ou nao triangular.
    '''

    print("Determina se um número n é triangular\n")

    # leia o valor de n
    n = int(input("Digite o valor de n: "))

    i = 1
    while i * (i+1) * (i+2) < n:
        i = i + 1

    if i * (i+1) * (i+2) == n:
        print("%d é o produto %d*%d*%d" %(n,i,i+1,i+2))
    else:
        print("%d nao é triangular" %(n))

#--------------------        
main()
Determina se um número n é triangular

Digite o valor de n: 120
120 é o produto 4*5*6

Problema 8.2

Dado um número natural na base binária, transformá-lo para a base decimal.

Exemplo:

Dado 10010, a saída será 18, pois 1 × 2^4 + 0 × 2^3 + 0 × 2^2 + 1 × 2^1 + 0 × 2^0 = 18.

Obs.: Esse exercício corresponde ao exercício 16 da lista de exercícios sobre inteiros.

Solução

In [3]:
def main():
    n = n_binario = int(input("Digite o número na base binária: ")) 
    n_decimal = 0
    pot2 = 1

    while n > 0:
        digito_binario = n % 10
        n = n // 10

        n_decimal = n_decimal + digito_binario * pot2
        pot2 = pot2 * 2

    print("O número decimal correspondente ao número binário", n_binario, "é o", n_decimal)
    
#-------------
main()
Digite o número na base binária: 10010
O número decimal correspondente ao número binário 10010 é o 18

Problema 8.3

Dados números inteiros n, i e j, todos maiores do que zero, imprimir em ordem crescente os n primeiros naturais que são múltiplos de i ou de j e ou de ambos.

Por exemplo, para n = 6, i = 2 e j = 3 a saída deverá ser:

0 2 3 4 6 8

Obs.: Esse exercício corresponde ao exercício 9 da lista de exercícios sobre inteiros.

Solução

In [1]:
def main():
    n = int(input("Digite n: "))
    i = int(input("Digite i: "))
    j = int(input("Digite j: "))

    # mutiplos de i e j
    mult_i = mult_j = 0

    k = 0
    while k < n:
        if mult_i == mult_j:
            print(mult_i)
            mult_i = mult_i + i
            mult_j = mult_j + j
        elif mult_i < mult_j:
            print(mult_i)
            mult_i = mult_i + i
        else:
            print(mult_j)
            mult_j = mult_j + j;
        
        k += 1

#------------
main()
Digite n: 6
Digite i: 2
Digite j: 3
0
2
3
4
6
8

Problema 8.4

Dado um número inteiro n>0, verificar se este número contém dois dígitos adjacentes iguais.

Solução

In [4]:
def main():
    n = int(input("Digite um número: "))
    
    contem_digitos_iguais = False     # Indicador de passagem!!!
    
    d_ant = n % 10
    n = n // 10
    d = 0
    while n > 0 and not contem_digitos_iguais:
        # pega o dígito menos significativo do número
        d_atual = n % 10
        n = n // 10    
        
        # compara o dígito com o anterior
        if d_atual == d_ant:
            contem_digitos_iguais = True    # Encontramos o que estávamos procurando!!!
        
        # na próxima execução do laço, o digíto atual será o anterior
        d_ant = d_atual

    if contem_digitos_iguais:
        print("Contém números adjacentes iguais")
    else:
        print("Não contém números adjacentes iguais")
    
#------------
main()    
Digite um número: 123445
Contém números adjacentes iguais

Problema 8.5

Dados um número inteiro n>0 e uma sequência com n números inteiros maiores do que zero, determinar o máximo divisor comum entre eles.

Por exemplo, para a sequência

3 42 30 105

o seu programa deve escrever o número 3.

Obs.: Este problema corresponde ao exercício 7 da lista de exercícios repetições encaixadas.

Solução 1

In [4]:
def main():
    n = int(input("Digite a quantidade de números da sequência: "))
    novo_mdc = mdc = int(input("Digite um número da sequência: "))
    for cont in range(1,n):     # o laço será executado exatamente n-1 vezes!
        num = int(input("Digite um número da sequência: "))
        divisor = 1
        while divisor <= mdc and divisor <= num:
            if mdc % divisor == 0 and num % divisor == 0:
                novo_mdc = divisor
            divisor += 1
        mdc = novo_mdc

    print("O MDC dos numeros é ", mdc)

#-----------
main()
Digite a quantidade de números da sequência: 3
Digite um número da sequência: 42
Digite um número da sequência: 30
Digite um número da sequência: 105
O MDC dos numeros é  3

A Solução 1 usa a igualdade mdc(a,b,c) == mdc(mdc(a,b),c).

Em cada iteração, o mdc de dois números, digamos num1 e num2, é encontrado examinando-se os números 1, 2, 3, ..., min(num1,num2) nessa ordem.

Solução 2

In [6]:
def main():
    n = int(input("Digite a quantidade de números da sequência: "))
    mdc = int(input("Digite um número da sequência: "))
    for cont in range(1,n):    # o laço será executado exatamente n-1 vezes!
        num = int(input("Digite um número da sequência: "))

        divisor = mdc
        while mdc % divisor != 0 or num % divisor != 0:
                divisor = divisor - 1

        mdc = divisor

    print("O MDC dos numeros é ", mdc)


#-----------
main()
Digite a quantidade de números da sequência: 3
Digite um número da sequência: 42
Digite um número da sequência: 30
Digite um número da sequência: 105
O MDC dos numeros é  3

A Solução 2 também usa a igualdade mdc(a,b,c) == mdc(mdc(a,b),c).

Entretanto, em cada iteração o mdc de dois números, digamos num1 e num2, é encontrado examinando-se os números num1, num1-1, num1-2, ..., 2, 1 nessa ordem.

Solução 3 (com uma pequena melhoria com relação à solução anterior)

In [10]:
def main():
    n = int(input("Digite a quantidade de números da sequência: "))
    mdc = int(input("Digite um número da sequência: "))
    for cont in range(1,n):      # o laço será executado exatamente n-1 vezes!
        num = int(input("Digite um número da sequência: "))

        if mdc < num:
            divisor = mdc
        else:
            divisor = num

        while mdc % divisor != 0 or num % divisor != 0:
                divisor = divisor - 1

        mdc = divisor

    print("O MDC dos numeros é ", mdc)

    
#-----------
main()
Digite a quantidade de números da sequência: 3
Digite um número da sequência: 42
Digite um número da sequência: 30
Digite um número da sequência: 105
O MDC dos numeros é  3

Solução 4 (uma solução bem diferente, que usa funções e o algoritmo de Euclides)

In [12]:
def main():
    n = int(input("Digite a quantidade de números da sequência: "))
    mdc_sequencia = int(input("Digite um número da sequência: "))
    
    for cont in range(1,n):      # o laço será executado exatamente n-1 vezes!
        num = int(input("Digite um número da sequência: "))
        mdc_sequencia = mdc(mdc_sequencia, num)
        
    print("O MDC dos numeros da sequência é ", mdc_sequencia)
    

#-------------------------------------------------
def mdc(a,b):
    ''' (int, int) -> int
    Função que calculda o máximo divisor comum (MDC) de a e b usando o algoritmo de Euclides,
    ou seja, usando a seguinte propriedade do MDC:
    
    MDC(a,b) = MDC(b,r), onde r é o resto da divisão inteira de a por b.
    '''
    while b != 0:
       r = a % b
       a = b
       b = r
    
    return a

#-------------------------------------------------
main()
Digite a quantidade de números da sequência: 3
Digite um número da sequência: 42
Digite um número da sequência: 30
Digite um número da sequência: 105
O MDC dos numeros da sequência é  3

Problema 8.5

Na figura, no plano cartesiano, a região sombreada não inclui as linhas de bordo. Note que o eixo y cai bem no meio da figura, e usamos o lado do quadrado para indicar as ordenadas correspondentes.

alt text

Escreva um programa que lê as coordenadas cartesianas (x, y) de um ponto, ambas do tipo float e imprime dentro se esse ponto está na região, e fora caso contrário.

Obs.: Baseada na questão 1 da Prova 1 de 2014.

Solução 1 (de várias possíveis)

In [2]:
def main():
    x = float(input("Digite x: "))
    y = float(input("Digite y: "))

    # suponha que (x,y) esta dentro
    dentro = True

    if x <= -5 or 5 <= x or y <= 0 or 8 <= y:
        # aqui sabemos que (x,y) esta fora da face
        dentro = False
    elif -3 <= x <=  3 and 1 <= y <= 2:
        # aqui sabemos que (x,y) esta na boca
        dentro = False
    elif -4 <= x <= -1 and 4 <= y <= 7:
        # aqui sabemos que (x,y) esta no olho esquerdo
        dentro = False
        if -3 < x < -2 and 5 < y < 6:
            # aqui sabemos que na verdade (x,y) esta na iris esquerda
            dentro = True
    elif  1 <= x <=  4 and 4 <= y <= 7:
        # aqui sabemos que (x,y) esta no olho direito
        dentro = False
        if  2 < x <  3 and 5 < y < 6:
            # aqui sabemos que na verdade (x,y) esta na iris direita
            dentro = True

    if dentro:
        print("dentro")
    else:
        print("fora")

#------------------
main()
Digite x: -2.5
Digite y: 5.5
dentro

Observe que, na solução 1, nós começamos supondo que o ponto está dentro (pois a variável indicadora de passagem dentro começa com o valor False) e depois fazemos as verificações necessárias para confirmar essa suposição. Uma solução alternativa igualmente válida seria começar supondo que o ponto está fora e então verificar se isso é verdade ou não.

Solução 2 (explora a simetria da figura com relação ao eixo x)

In [3]:
def main():
    x_pos = x = float(input("Digite x: "))
    y = float(input("Digite y: "))

    if x < 0: # simetria ;-)
        x_pos = -x

    # suponha que (x,y) que esta dentro
    dentro = True

    if x_pos >= 5 or y >= 8 or y <= 0:
        # aqui sabemos que (x,y) esta fora da face
        dentro = False
    elif 0 <= x_pos <= 3 and 1 <= y <= 2:
        # aqui sabemos que (x,y) esta na boca
        dentro = False
    elif 1 <= x_pos <= 4 and 4 <= y <= 7:
        # aqui sabemos que (x,y) esta em um olho
        if not (2 < x < 3 or 5 < y < 6):
            # aqui sabemos que (x,y) esta fora da iris
            dentro = False

    if dentro:
        print("dentro")
    else:
        print("fora")

#-------------
main()
Digite x: 4
Digite y: 6.5
fora

Tópicos vistos na Aula 8

Revisão

  • Exercícios simples com números inteiros e operadores para inteiros
  • Exercícios envolvendo condições em cadeia e expressões lógicas
  • Exercícios envolvendo laços com indicador de passagem
  • Exercícios com laços aninhados
  • Exercícios com funções