Desafio Python
Números primos com while e continue
Enunciado
Escreva um programa que use um laço while para verificar e imprimir todos os números primos entre 2 e 30 (inclusive). Use continue para pular números não primos e break para otimizar a verificação de divisores.
Requisitos
- Usar
whilecomo laço principal. - Usar
continuepara pular números que não são primos. - Usar
breakao encontrar um divisor para otimizar. - Imprimir cada primo em uma linha separada.
Código inicial
# Complete o código
numero = 2
while numero <= 30:
# verifique se é primo
numero += 1
Saída esperada
2
3
5
7
11
13
17
19
23
29
Ver dica
Para testar se n é primo, verifique divisores de 2 até a raiz quadrada de n. Use break se encontrar um divisor.
Mostrar solução
numero = 2
while numero <= 30:
# Verifica se 'numero' é primo
divisor = 2
while divisor * divisor <= numero:
if numero % divisor == 0:
break # encontrou divisor, não é primo
divisor += 1
else:
# O else do while executa se não houve break
print(numero)
numero += 1
Passo a passo
- Iniciamos
numerocom 2, o primeiro primo. - O
whileexterno percorre de 2 a 30. - Para cada
numero, inicializamosdivisor = 2. - O
whileinterno testa divisores até quedivisor * divisor > numero(equivalente a testar até a raiz quadrada). - Se
numero % divisor == 0, encontramos um divisor, então usamosbreakpara sair do loop interno. - O
elsedowhileinterno executa apenas se o loop terminar sembreak, ou seja, se nenhum divisor foi encontrado — logo,numeroé primo. - Imprimimos o primo e incrementamos
numero.
Por que funciona
O while externo controla a sequência de números. O while interno verifica a primalidade. O break interrompe a verificação assim que um divisor é encontrado, otimizando o processo. O else do while é executado somente quando o loop interno termina naturalmente (sem break), indicando que o número é primo. O continue não foi usado explicitamente aqui, mas poderia substituir o else para pular a impressão.
Erros comuns
- Esquecer de incrementar
divisor: loop infinito. - Usar
rangedentro dowhilesem necessidade: owhilejá controla a repetição. - Confundir o
elsedowhilecom oelsedoif: oelsedowhilepertence ao loop, não à condição. - Não limitar a verificação à raiz quadrada: funciona, mas é menos eficiente.
Outra forma de resolver
numero = 2
while numero <= 30:
for divisor in range(2, int(numero ** 0.5) + 1):
if numero % divisor == 0:
break
else:
print(numero)
numero += 1
Usa for no lugar do while interno, mais idiomático para intervalos conhecidos.
Saída esperada
2
3
5
7
11
13
17
19
23
29