xMAC2166 - Introdução à Computação
x14/04/2014 - Aula 6
xProblema 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.
xSolução 1 (usando uma variável (booleana) indicadora de passagem)
# leia o valor de nn = 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-1divisor = 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.
xSolução 2 (contando os divisores de n entre 1 e n)
# leia o valor de nn = int(input("Digite o valor de n (n > 0): "))
# inicialize o contador de número de divisores de ncont_divisores = 0
# conta o número de divisores entre 1 e nfor divisor in range(1,n+1):
if n % divisor == 0:
cont_divisores += 1
# imprima mensagemif cont_divisores == 2:
print(n, "é primo")
else:print(n, "não é primo")
xNa 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
xProblema 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
xProblema 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.
xSoluçã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)
xA 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.
xSoluçã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)
xA 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.
xSoluçã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)
xProblema 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))
xTópicos vistos na Aula 6
- Mais exercícios envolvendo laços com indicador de passagem
- Exercícios com laços aninhados
xReferê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/
