Bom, existem vários algoritmos diferentes, mas um bem simples é ir dividindo o número por vários outros até encontrar um que o resto da divisão dê zero. Só que você não precisa testar com todos os números, dá para otimizar um pouco. Basta considerar que:
- o único número par que também é primo é o 2
- então se não for 2 e for par, eu já sei que não é primo
- eu não preciso testar se é divisível por outros números pares (4, 6, 8, etc), pois se for, quer dizer também que é divisível por 2 (ou seja, é par, e portanto não é primo)
Sendo assim, ficaria desta forma:
num = int(input("Digite um numero"))
if num < 2: # 0 e 1 não são primos, e vou desconsiderar os números negativos
print('não é primo')
elif num == 2: # 2 é o único número par que é primo
print('primo')
elif num % 2 == 0: # se for par e não é 2, não é primo
print('não é primo')
else: # aqui eu sei que o número é ímpar
# só testo se é divisível por números ímpares
for i in range(3, num // 2, 2):
if num % i == 0:
print('não é primo')
break # não é primo, interrompe o for
else:
print('é primo')
Repare que 0 e 1 não são primos, e eu não incluí tratamento para números negativos (vai dizer que eles não são primos).
Depois eu testo se é 2 (se for, é primo). Se não for 2, eu vejo se é par (se for, não é primo).
Por fim, se o número for ímpar, eu testo se é divisível pelos números ímpares de 3 até a metade do número (sim, não precisa ir até num
-e na verdade eu só precisaria ir até a raiz quadrada de num
).
O range
pula de 2 em 2, assim eu só testo se é divisível por números ímpares. Não precisa testar os números pares, pois se num
fosse divisível por um número par, ele também seria divisível por 2 e teria entrado no elif num % 2 == 0
.
E eu uso um for
/else
: se o for
não for interrompido pelo break
, ele entra no else
(veja a documentação para mais detalhes).