mqvc Posted October 30, 2009 at 08:58 PM Report Share #294103 Posted October 30, 2009 at 08:58 PM 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 More sharing options...
fnds Posted October 30, 2009 at 09:05 PM Report Share #294104 Posted October 30, 2009 at 09:05 PM 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) Link to comment Share on other sites More sharing options...
mqvc Posted October 30, 2009 at 09:09 PM Author Report Share #294107 Posted October 30, 2009 at 09:09 PM como e que traduzo isso para python? Link to comment Share on other sites More sharing options...
fnds Posted October 30, 2009 at 09:14 PM Report Share #294108 Posted October 30, 2009 at 09:14 PM 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. Link to comment Share on other sites More sharing options...
mqvc Posted October 30, 2009 at 09:16 PM Author Report Share #294109 Posted October 30, 2009 at 09:16 PM no quatro nao obtenho resposta Link to comment Share on other sites More sharing options...
fnds Posted October 30, 2009 at 10:06 PM Report Share #294111 Posted October 30, 2009 at 10:06 PM Mostra o código que fizeste. Link to comment Share on other sites More sharing options...
thranduil Posted October 30, 2009 at 11:03 PM Report Share #294114 Posted October 30, 2009 at 11:03 PM 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 More sharing options...
fnds Posted October 30, 2009 at 11:21 PM Report Share #294115 Posted October 30, 2009 at 11:21 PM 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. Link to comment Share on other sites More sharing options...
thranduil Posted October 31, 2009 at 12:08 AM Report Share #294120 Posted October 31, 2009 at 12:08 AM 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 More sharing options...
fnds Posted October 31, 2009 at 12:56 AM Report Share #294125 Posted October 31, 2009 at 12:56 AM 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 Link to comment Share on other sites More sharing options...
mqvc Posted October 31, 2009 at 01:43 AM Author Report Share #294129 Posted October 31, 2009 at 01:43 AM Não consigo perceber qual é o problema do meu programa.. podes me tentar explicar? o teu ja percebi como fizeste Link to comment Share on other sites More sharing options...
fnds Posted October 31, 2009 at 01:58 AM Report Share #294130 Posted October 31, 2009 at 01:58 AM 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 More sharing options...
djthyrax Posted November 1, 2009 at 11:37 PM Report Share #294335 Posted November 1, 2009 at 11:37 PM 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 More sharing options...
Recommended Posts
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 accountSign in
Already have an account? Sign in here.
Sign In Now