## Recommended Posts

Ola!

Estou agora a iniciar me em python e ao fazer um programa que testa se um número é primo ou não tenho me deparado com vários erros, seria possível ajudarem-me?

```def testaPrimo (n):
i=(1,n-1)
if n==0 or n==1:
return False

elif n==2 and n==3:
return True

for i in range (2, n):
if i<n and n%i==0:
return False
else:
return True
```
##### Share on other sites

Que erros?

Dica: para saberes se o número n é primo só tens de verificar se ele é divisível por algum número desde 2 até n-1. Para fazeres o programa basta fazeres aquilo literalmente.

(na realidade basta até sqrt(n), mas isso fica para depois)

##### Share on other sites

Um ciclo que a cada por cada x<(n-1) verifica se x divide n, se dividir retornas false, se o ciclo acabar significa que não existe nenhum x que divida n, logo retornas true.

##### Share on other sites

Hey!

mqvc, quanto ao teu código, corri-o e o único problema que encontrei foi que para 2, o output é "None".

Acho que não precisas desse elif porque essas situações já estão incluídas no ciclo. E nas condições do if que tá dentro do ciclo, penso que não precisas de requerer que i seja menor que n pois pela definição do range, o i nunca será igual a n 😄

Por acaso tive que resolver este problema como resposta a um exercício para a minha cadeira de programação (introdução à programação). Fi-lo da seguinte forma:

```def testaPrimo(n):
if n==0 or n==1:
return False
elif n>1:
for i in range(2,n):
if (n % i )==0:
return False
break
return True```

Penso que funciona correctamente pois submeti-o ao Mooshak (a plataforma que a FCUP usa para avaliação dos exercícios obrigatórios) e ele disse que estava correcto.

Numa parte posterior do exercício, a sugestão era tornar o programa mais eficiente. Para isso, como o fnds disse, basta analizar se o número em causa é divisível por algum número até sqrt(n). O que eu fiz foi apenas alterar o limite superior do range.

```import math

def testaPrimo(n):
if n==0 or n==1:
return False
elif n>1:
for i in range(2,math.sqrt(n)):
if (n % i )==0:
return False
break
return True
```

O problema é que esta mudança não funciona completamente. Isto porque para os números entre 2 e 9 o resultado é True (e para mais alguns, como o 15 e o 26), ou seja, esses números são todos considerados primos. Podem-me ajudar neste pormenor? 😉

Update:

modifiquei o limite superior do range para math.sqrt(n)+1. No meu computador já não há qualquer erro e os resultados estão correctos (trabalho em windows vista, de casa). Depois de fazer o upload do programa para o Mooshak, recebi o seguinte erro (que é o que recebo nos computadores com Linux, lá da faculdade):

./testaPrimo.py:27: DeprecationWarning: integer argument expected, got float

for i in range(2,math.sqrt(n)+1):

Any ideas? :\ Não percebo mesmo o que se passa, sendo que no meu computador tudo funciona sem erros...

##### Share on other sites

Olha um companheiro de faculdade 😉

Esse aviso aparece porque a versão do python que corre o programa detectou alguma coisa que não vai ser suportada no futuro.

Neste caso é usar floats no range. Sugeria-te que usas-ses um cliclo while em vez de um for nessa situação.

##### Share on other sites

Olha um companheiro de faculdade 😛

Esse aviso aparece porque a versão do python que corre o programa detectou alguma coisa que não vai ser suportada no futuro.

Neste caso é usar floats no range. Sugeria-te que usas-ses um cliclo while em vez de um for nessa situação.

😄 Obrigado pela resposta! Resolvi o problema colocando o limite superior do range como int(math.sqrt(n))+1 😉 Assim já ficou um inteiro. E o mooshak aceitou portanto tá feitinho 😄

##### Share on other sites

A minha solução:

```from math import sqrt
def testaPrimo(x):
if 0<=x<2:
return False
if x>=2:
y = 2
y_max = sqrt(x)
while y<=y_max:
if x%y==0:
return False
y = y+1
return True```
##### Share on other sites

Não consigo perceber qual é o problema do meu programa.. podes me tentar explicar?

o teu ja percebi como fizeste

##### Share on other sites

O problema está aqui:

```def testaPrimo (n):
i=(1,n-1)
if n==0 or n==1:
return False

elif n==2 and n==3:
return True

for i in range (2, n):
if i<n and n%i==0:
return False
else:
return True
```

Tu com o else: return True não estás a deixar o ciclo acabar, só podes fazer return True quando o ciclo acabar.

Neste momento o teu programa está a fazer:

2|9 (2 divide 9) -> falso

então

tens de fazer com que

2|9 -> falso

então volta ao inicio e

retorna falso

2|5 -> falso

então volta ao inicio e

3|5 -> falso

então volta ao inicio e

4|5 -> falso

então sai do ciclo porque o range só vai até 5-1

retorna true

podes apagar a 2ª linha e no if podes retirar o "i<n" isto é sempre verdade.

##### Share on other sites

A minha solução:

```from math import sqrt
def testaPrimo(x):
if 0<=x<2:
return False
if x>=2:
y = 2
y_max = sqrt(x)
while y<=y_max:
if x%y==0:
return False
y = y + 1
return True```

```from math import sqrt
def testaPrimo(x):
if x in [0,1] or (x%2) == 0:
return False
y = 3
y_max = sqrt(x)
while y<=y_max:
if x%y==0:
return False
y += 2
return True```

Não peças ajuda por PM! A tua dúvida vai ter menos atenção do que se for postada na secção correcta do fórum!

## Create an account

Register a new account

×

• #### Revista PROGRAMAR

• Wiki
• IRC
×
• Create New...