MAC2166 - Introdução à Computação

04/04/2017 - Aula 7

Problema 7.1

  • Parte 1: Faça uma função que recebe um número inteiro n e devolve True se n é primo e devolve False em caso contrário.

  • Parte 2: Faça um programa que lê um número inteiro n, n > 0 e para cada número entre 1 e n indica se ele é soma de dois primos.

Parte 1: Solução 1 (usando uma variável (booleana) indicadora de passagem)

In [2]:
def primo(n):
    ''' (int) -> bool

    Recebe um numero n > 0 e retorna True se
    n é primo e False em caso contrário.
    '''

    # n é primo até que se prove o contrário
    eh_primo = True
    
    # procure por um divisor de n entre 2 e n-1
    div = 2
    while div < n and eh_primo:  # equivalente a "div... and é_primo == True:"
        if n % div == 0:
            eh_primo = False
        div += 1

    return eh_primo and n != 1   # 1 não é primo 

É importante lembrar que um número inteiro é primo se ele é maior do que 1 e seus únicos divisores são ele mesmo e 1. Assim, 1 não é primo.

Parte 1 - Solução 2 (contando os divisores de n entre 1 e n)

In [3]:
def primo(n):
    ''' (int) -> bool

    Recebe um numero n > 0 e retorna True se
    n é primo e False em caso contrário.
    '''
    
    # iniciae o contador de número de divisores de n
    cont_divisores = 0

    # conta o número de divisores entre 1 e n
    for divisor in range(1,n+1):
        if n % divisor == 0:
            cont_divisores += 1 

    
    if cont_divisores == 2:
        return True
    else:
        return False

Na solução acima, é importante observarmos dois comandos que apareceram de forma um pouco diferente do que vínhamos usando em exercícios anteriores:

i) for divisor in range(1,n+1):

Vimos em outras aulas que ao usar o for i in range(n), criamos um laço que executa exatamente n vezes, com i assumindo o valor inicial zero. Na última execução do laço, i vale n-1.

Entretanto, no for acima, a função range recebe dois valores. range(i,f) representa o seguinte intervalo de valores: [i, f[ (ou seja, os valores entre i e f, incluindo o valor i, mas excluindo o valor f. Portanto, o laço for usado na solução acima é executado (n+1)-1 = n vezes, sendo que a variável divisor assume na primeira execução do laço o valor 1 e a cada execução do laço é incrementada em 1. Na última execução do laço, divisor valerá n.

ii) cont_divisores += 1

Esse comando equivale ao comando a seguir:

cont_divisores = cont_divisores + 1

Ou seja, o operador += faz duas operações: ele soma o valor à direita ao valor da variável à esquerda e depois atribui o resultado da soma à variável.

Os operadores -=, *=, //=, /=, **= e %= funcionam de modo análogo. Veja os exemplos a seguir:

In [4]:
i = 10
i += 1
print(i)
i *= 10
print(i)
i //= 5
print(i)
i **= 2
print(i)
11
110
22
484

Parte 2 - Solução

In [6]:
def main():
    '''
    Programa que lê um número inteiro n, n > 0 e para cada número entre 1 e n indica se ele é soma de dois primos.
    '''

    n = int(input("Digite n: "))

    i = 1
    while i <= n:
        j = 2
        eh_soma = False    # até que se prove o contrário, assume-se que i não é soma de dois primos
        while j < i and not eh_soma:
            if primo(j) and primo(i-j):
                eh_soma = True   # indica foi encontrado um par de primos cuja soma dá i
                p = j
                q = i - j
            j += 1

        if eh_soma:
            print("%d é soma dos primos %d e %d" %(i,p,q))
        else:
            print("%d não é soma de primos" %(i))

        i += 1

def primo(n):
    ''' (int) -> bool

    Recebe um numero n > 0 e retorna True se
    n é primo e False em caso contrário.
    '''

    # n é primo até que se prove o contrário
    eh_primo = True
    
    # procure por um divisor de n entre 2 e n-1
    div = 2
    while div < n and eh_primo:  # equivalente a "div... and é_primo == True:"
        if n % div == 0:
            eh_primo = False
        div += 1

    return eh_primo and n != 1   # 1 não é primo 

#--------------------------------------
main()
Digite n: 10
1 não é soma de primos
2 não é soma de primos
3 não é soma de primos
4 é soma dos primos 2 e 2
5 é soma dos primos 2 e 3
6 é soma dos primos 3 e 3
7 é soma dos primos 2 e 5
8 é soma dos primos 3 e 5
9 é soma dos primos 2 e 7
10 é soma dos primos 3 e 7

Problema 7.2

Dado um número inteiro n, n>1, imprimir sua decomposição em fatores primos, indicando também a mutiplicidade de cada fator. Por exemplo, para n=600, a saída deverá ser: fator 2 multiplicidade 3 fator 3 multiplicidade 1 fator 5 multiplicidade 2

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

In [8]:
def main():
    n = int(input("Entre com o numero (> 1) a ser decomposto: "))
    print("Decomposicao de %d em fatores primos:" %(n))  

    fator = 2
    while n > 1:
        mult = 0    # conta a multiplicidade do fator atual
        while n % fator == 0:
            mult += 1
            n = n // fator

        if mult != 0:
            print("  fator %d multiplicidade %d" %(fator, mult)) 
            
        fator += 1
        
main()
Entre com o numero (> 1) a ser decomposto: 600
Decomposicao de 600 em fatores primos:
  fator 2 multiplicidade 3
  fator 3 multiplicidade 1
  fator 5 multiplicidade 2

Tópicos vistos na Aula 7

  • Mais exercícios envolvendo laços com indicador de passagem
  • Exercícios com laços aninhados