Jump to content

PRIMOS


mqvc

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
                
Link to comment
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...

Link to comment
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 😄

Link to comment
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

retorna verdadeiro

tens de fazer com que

2|9 -> falso

então volta ao inicio e

3|9 -> verdadeiro

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.

Link to comment
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!

Link to comment
Share on other sites

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now
×
×
  • Create New...

Important Information

By using this site you accept our Terms of Use and Privacy Policy. We have placed cookies on your device to help make this website better. You can adjust your cookie settings, otherwise we'll assume you're okay to continue.