• Revista PROGRAMAR: Já está disponível a edição #53 da revista programar. Faz já o download aqui!

mqvc

PRIMOS

13 mensagens neste tópico

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
                

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros 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)

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros 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.

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros 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 :D

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...

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros 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.

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Olha um companheiro de faculdade :P

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.

:D 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 :D

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros 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

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

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

o teu ja percebi como fizeste

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros 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.

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros 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

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Crie uma conta ou ligue-se para comentar

Só membros podem comentar

Criar nova conta

Registe para ter uma conta na nossa comunidade. É fácil!


Registar nova conta

Entra

Já tem conta? Inicie sessão aqui.


Entrar Agora