x
MAC2166 - Introdução à Computação
x
14/04/2014 - Aula 6
x
Problema 10
Dado um número inteiro n
, n>0
, verificar se n
é primo.
Obs.: Este problema corresponde ao exercício 11 da lista de exercícios sobre inteiros.
x
Solução 1 (usando uma variável (booleana) indicadora de passagem)
# leia o valor de n
n = int(input("Digite o valor de n (n > 0): "))
# n é primo até que se prove o contrário
é_primo = True
# procure por um divisor de n entre 2 e n-1
divisor = 2
while divisor < n and é_primo: # equivalente a "div... and é_primo == True:"
if n % divisor == 0:
é_primo = False
divisor += 1
if é_primo and n != 1: # 1 não é primo
print(n, "é primo")
else:
print(n, "não é primo")
x
É 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.
x
Solução 2 (contando os divisores de n
entre 1 e n
)
# leia o valor de n
n = int(input("Digite o valor de n (n > 0): "))
# inicialize 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
# imprima mensagem
if cont_divisores == 2:
print(n, "é primo")
else:
print(n, "não é primo")
x
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:
i = 10
i += 1
print(i)
i *= 10
print(i)
i //= 5
print(i)
i **= 2
print(i)
11 110 22 484
x
Problema 11
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.
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
while n % fator == 0:
mult += 1
n = n // fator
if mult != 0:
print(" fator %d multiplicidade %d" %(fator, mult))
fator += 1
x
Problema 12
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.
x
Solução 1
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):
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)
x
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.
x
Solução 2
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):
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)
x
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.
x
Solução 3 (com uma pequena melhoria com relação à solução anterior)
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):
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)
x
Problema Extra
Dados um número inteiro n
, n>0
, e uma sequência com n
números inteiros maiores do que zero, determinar o fatorial de cada número da sequência.
n = int(input("Digite a quantidade de números da sequência "))
for cont in range(n):
copia = num = int(input("Digite um número da sequência: "))
fat = 1
while num > 1:
fat *= num
num -= 1
print("%d! = %d" %(copia,fat))
x
Tópicos vistos na Aula 6
- Mais exercícios envolvendo laços com indicador de passagem
- Exercícios com laços aninhados
x
Referências e outros materiais para estudo
- Computer Science Circles >> http://cscircles.cemc.uwaterloo.ca/
- Think Python - How to Think Like a Computer Scientist >> http://www.greenteapress.com/thinkpython/thinkpython.html
- Projeto MacMulti - Listas de exercícios (Introdução à Computação) >> http://www.ime.usp.br/~macmulti/exercicios/