Python Débutant en Boucle (pour Trouver les nombres Premiers)
Je suis vraiment un débutant en python, donc je m'excuse pour le manque de connaissances, mais la raison pour laquelle je demande, c'est que la lecture de l'Python manuel et tutoriel (http://docs.python.org/2.7/tutorial) je ne suis pas totalement incapable de comprendre la façon dont les boucles de travail. J'ai écrit des programmes simples donc je pense que j'ai les bases mais pour quelque raison que ce programme, qui est destinée à la liste de tous les nombres premiers inférieurs ou égaux à n, est pas de travail:
n = int(raw_input("What number should I go up to? "))
p = 2
while p <= n:
for i in range(2, p):
if p%i == 0:
p=p+1
print "%s" % p,
p=p+1
print "Done"
La sortie quand je rentre par exemple 100:
2 3 5 7 11 13 17 19 23 27 29 31 35 37 41 43 47 53 59 61 67 71 73 79 83 87 89 95 97 101 Done
Qui ressemble presque à un droit, mais pour une raison quelconque contient 27, 35, 95, qui sont en composite de cours. J'ai essayé de faire ressortir la façon dont ma boucle fonctionne, mais je ne vois pas où il ignore la vérification de divisibilité tout d'un coup. J'ai pensé que si quelqu'un avait un regard qu'ils pouvaient m'expliquer ce que sur la syntaxe en est la cause. Merci beaucoup!
Ce n'est pas que pour la boucle est mal - à- l'algorithme est. Avez-vous essayé de l'exécution de ce papier? Si il vous donne le même (mauvais) résultats, vous êtes à la compréhension de la boucle correctement, mais l'algorithme est faux
Eh bien, je pense que l'algorithme fonctionne sur le papier: au moins, si ce que je suis en cours d'exécution sur le papier est ce que j'ai écrit en python. Lorsque p devient avancé pour 27 par exemple, la je boucle devriez trouver que p est divisible par 3 lorsque la je boucle atteint 3, et alors p doit être parcouru avec impatience 28. Pourriez-vous m'aider à comprendre où l'écart entre ma compréhension et de ce que j'ai écrit?
et puis vous commencez à vérifier si 28 est divisible par 4, alors
i
va à 5, et vous vérifiez si 29 est divisible par 5, mais vous ne jamais vérifier le numéro de moins de 5.OriginalL'auteur | 2013-02-01
Vous devez vous connecter pour publier un commentaire.
Je fait restructurer le programme ressemble à ceci:
C'est peut-être un plus idiomatique de la solution (à l'aide d'un
for
boucle au lieu d'unwhile
de la boucle), et fonctionne parfaitement.L'extérieur
for
boucle itère sur tous les nombres de 2 àn
.L'intérieur on itère pour tous les nombres de 2 à
p
. S'il atteint un nombre qui divise de manière égalep
, puis il éclate de l'intérieur de la boucle.La
else
bloc s'exécute chaque fois que la boucle for n'est pas rompu (impression des nombres premiers).Ensuite, le programme imprime
'Done'
fois celle-ci terminée.Comme une note de côté, il vous suffit de parcourir les 2 à la racine carrée de
p
, puisque chaque facteur a une paire. Si vous n'obtenez pas un match il n'y aura pas d'autres facteurs après la racine carrée, et le nombre sera premier.OriginalL'auteur Volatility
Votre code a deux boucles, l'une dans l'autre. Il devrait vous aider à comprendre le code, si vous remplacez la boucle interne avec une fonction. Ensuite, assurez-vous que la fonction est correcte et peut se tenir debout sur ses propres (distincte de la boucle externe).
Voici ma réécriture de votre code d'origine. Cette réécriture fonctionne parfaitement.
Noter que
is_prime()
ne touche pas à l'indice de boucle de la boucle externe. C'est un stand-alone, fonction pure. L'incrémentation de lap
à l'intérieur de la boucle interne était le problème, et cette version déclinée n'est pas le problème.Maintenant, nous pouvons facilement réécrire à l'aide de
for
boucles et je pense que le code est améliorée:Noter qu'en Python,
range()
ne sont jamais inclus la limite supérieure que vous avez passé. Donc, la boucle interne, qui vérifie< n
, il suffit de l'appelerrange(2, n)
mais pour la boucle externe, où nous voulons<= n
, nous avons besoin d'ajouter un àn
de sorte quen
seront inclus:range(2, n+1)
Python intègre des trucs qui est amusant. Vous n'avez pas besoin d'apprendre tous ces trucs tout de suite, mais voici une autre façon, vous pouvez écrire
is_prime()
:Cela fonctionne exactement comme la
for
boucle version deis_prime()
. Il définiti
à des valeurs derange(2, n)
et contrôles de chacun, et si un test échoue, il arrête la vérification et les retours. Si elle vérifien
contre chaque nombre dans l'intervalle et pas tout d'entre eux partagentn
également, puis le nombre est premier.Encore une fois, vous n'avez pas besoin d'apprendre tous ces trucs tout de suite, mais je pense qu'ils sont une sorte de plaisir lorsque vous ne les apprendre.
OriginalL'auteur steveha
Cela devrait fonctionner et est un peu plus optimisé
OriginalL'auteur Adeel
Veuillez comparer votre extrait de code avec l'un collé ci-dessous et vous verrez où vous avez eu tort.
L'Indentation est allé de mal de copie à partir de l'éditeur ici....Il a été corrigé maintenant.
OriginalL'auteur Guddu
vous n'avez pas re-démarrer le
i
boucle après, vous trouverez un non-premierUn
while
boucle s'exécute le corps, puis vérifie si la condition d'en haut estTrue
, si c'est vrai, il ne le corps à nouveau. Unfor
boucle s'exécute le corps une fois pour chaque élément de l'itérateur.Étape à travers elle dans votre tête. Imaginez que vous commencez avec
p=25
. Donc, vous nefor i in range(2, p)
. Lorsquei
atteint 5, qui divise25
, afin de vous faire unep = p + 1
. Alors maintenant,p=26
... et vous continuezi=6
. Cela ne veut pas diviser le 26, si vous allez à 7, 8, 9, 10, 11, 12, 13. Qui divise 26, de sortep = p + 1
, et maintenantp=27
, et il essaie de 14 à 26 ans, aucun de qui divisent 27, par conséquent, 27 est premier.Mais il peut être un petit changement, et certainement serait plus lisible, juste au sortir de la
for
boucle une fois que vous trouvez quep
n'est pas le premier, au lieu d'essayer d'augmenterp
eti
dans deux endroits différents chaque. (L'inconvénient est que l'évidence pythonic façon de le faire serait unefor:
/else:
, qui tend à confondre les nouveaux arrivants à la langue...)Sortir de la boucle après la découverte d'un non-prime et de l'avancement de p+1 est exactement ce que j'espérais faire, mais en mettant une pause n'est pas de faire ce que j'espère qu'il le ferait. Je comprends que le problème est maintenant, mais sans la restructuration du code de trop, comment puis-je réinitialiser la je boucle après un non-prime est découvert?
En fin de compte, j'ai réalisé que ce que je voulais être en mesure de le faire a l'aide d'autre: après:, ce qui signifie exécuter si le pour: boucle a été épuisé. Merci pour votre aide, je pense que je suis en train de faire des progrès maintenant.
OriginalL'auteur tacaswell
Pour trouver le PREMIER NUMÉRO de
OriginalL'auteur John Haggin
Nous allons faire un couple de plus d'améliorations.
sqrt
et*
exemples), vous n'avez pas besoin de test pour un nombre premier.J'ai écrit mon code et chacun des éléments ci-dessus permettrait d'améliorer mon code temps d'exécution d'environ 500%.
OriginalL'auteur Omid
OriginalL'auteur Ahsanul kabir
Je vais dire à votre erreur,dans la ligne 3 vous êtes incrimenting p mais en fait ce qui vous manque est votre je si votre je dans le cas précédent est disons 13 alors il va vérifier votre boucle après le 13, mais c'est en laissant 2,3,5,7,11 de sorte que son une erreur .c'est ce qui se passe dans le cas de 27 votre-je avant 27 13 et maintenant, il va vérifier à partir de 14.et je ne pense pas u besoin d'une solution.
OriginalL'auteur mayank
OriginalL'auteur brilliant
Voici un plus vaste exemple avec l'optimisation dans l'esprit de Python 3.
Ce programme a deux principales optimisations, première itération porte uniquement à partir de la 2 à la racine carrée de n et il ne parcourt les nombres impairs. L'utilisation de ces optimisations, j'ai pu constater que le nombre 1000000007 est le premier que dans 15811 itérations de boucle.
OriginalL'auteur Sonny Parlin
Mieux utiliser
OriginalL'auteur Ioannis
Ce qui à mon avis est un plus, de façon à optimiser. Trouve tous les nombres premiers jusqu'à 1 000 000 en moins de 8 secondes sur mon installation.
Il est également l'un de mes tout premiers essais de python, donc je me tiens à être corrigé
OriginalL'auteur J. Fenech