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.
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.
n
entre 1 e n
)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:
i = 10
i += 1
print(i)
i *= 10
print(i)
i //= 5
print(i)
i **= 2
print(i)
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()
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.
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()