Je suis vraiment un débutant chez Python, alors je m'excuse pour le manque de connaissances, mais la raison pour laquelle je vous pose cette question est que vous lisez le manuel et le tutoriel Python ( http://docs.python.org/2.7/tutorial ) Je ne suis pas incapable de comprendre totalement le fonctionnement des boucles. J'ai écrit quelques programmes simples, je pense donc comprendre les bases mais, pour une raison quelconque, ce programme censé répertorier tous les nombres premiers inférieurs ou égaux à n ne fonctionne pas:
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 lorsque j'entre 100 par exemple est:
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
Ce qui semble presque correct mais pour une raison quelconque contient 27, 35, 95, qui sont composites bien sûr. J'ai essayé de distinguer le fonctionnement de ma boucle, mais je ne vois tout simplement pas où la vérification de la divisibilité n'est pas faite subitement. Je pensais que si quelqu'un jetait un coup d'œil, il pourrait m'expliquer ce que la syntaxe provoque. Merci beaucoup!
En fait, je restructurerais le programme pour ressembler à ceci:
for p in range(2, n+1):
for i in range(2, p):
if p % i == 0:
break
else:
print p,
print 'Done'
C'est peut-être une solution plus idiomatique (en utilisant une boucle for
au lieu d'une boucle while
), et fonctionne parfaitement.
La boucle for
extérieure parcourt tous les nombres de 2 à n
.
Le numéro intérieur itère tous les nombres de 2 à p
. Si elle atteint un nombre qui se divise également en p
, elle sort de la boucle interne.
Le bloc else
s'exécute chaque fois que la boucle for n'est pas interrompue (impression des nombres premiers).
Ensuite, le programme imprime 'Done'
à la fin.
En remarque, il vous suffit de parcourir 2 à la racine carrée de p
, car chaque facteur a une paire. Si vous n'obtenez pas de correspondance, il n'y aura pas d'autres facteurs après la racine carrée, et le nombre sera premier.
Votre code a deux boucles, l'une dans l'autre. Cela devrait vous aider à comprendre le code si vous remplacez la boucle interne par une fonction. Ensuite, assurez-vous que la fonction est correcte et peut être autonome (séparée de la boucle extérieure).
Voici ma réécriture de votre code original. Cette réécriture fonctionne parfaitement.
def is_prime(n):
i = 2
while i < n:
if n%i == 0:
return False
i += 1
return True
n = int(raw_input("What number should I go up to? "))
p = 2
while p <= n:
if is_prime(p):
print p,
p=p+1
print "Done"
Notez que is_prime()
ne touche pas l'indice de boucle de la boucle externe. C'est une fonction pure autonome. Incrémenter p
à l'intérieur de la boucle interne était le problème, et cette version décomposée n'a pas le problème.
Maintenant, nous pouvons facilement réécrire en utilisant des boucles for
et je pense que le code est amélioré:
def is_prime(n):
for i in range(2, n):
if n%i == 0:
return False
return True
n = int(raw_input("What number should I go up to? "))
for p in range(2, n+1):
if is_prime(p):
print p,
print "Done"
Notez qu'en Python, range()
n'inclut jamais la limite supérieure que vous indiquez. Ainsi, la boucle interne, qui vérifie < n
, nous pouvons simplement appeler range(2, n)
, mais pour la boucle externe, où nous voulons <= n
, nous devons en ajouter un à n
afin que n
sera inclus: range(2, n+1)
Python a des fonctionnalités intégrées qui sont amusantes. Vous n'avez pas besoin d'apprendre toutes ces astuces immédiatement, mais voici une autre façon d'écrire is_prime()
:
def is_prime(n):
return not any(n%i == 0 for i in range(2, n))
Cela fonctionne comme la version de la boucle for
de is_prime()
. Il définit i
sur les valeurs de range(2, n)
et les vérifie. Si un test échoue, il arrête la vérification et renvoie. Si elle vérifie n
par rapport à chaque nombre compris dans la plage et et non aucun divise n
de manière égale, alors 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 plutôt amusants quand vous les apprenez.
Cela devrait fonctionner et est un peu plus optimisé
import math
for i in range(2, 99):
is_prime = True
for j in range(2, int(math.sqrt(i)+1)):
if i % j == 0:
is_prime = False
if is_prime:
print(i)
vous ne redémarrez pas la boucle i
après avoir trouvé un non-prime
p = i = 2
while p <= n:
i = 2
while i < p:
if p%i == 0:
p += 1
i = 1
i += 1
print p,
p += 1
print "Done"
Une boucle while
exécute le corps, puis vérifie si la condition en haut est True
; si elle est vraie, elle refait le corps. Une boucle for
exécute le corps une fois pour chaque élément de l'itérateur.
Veuillez comparer votre extrait avec celui collé ci-dessous et vous remarquerez où vous vous êtes trompé.
n = int(raw_input("What number should I go up to? "))
p = 2
while p <= n:
is_prime=True
for i in range(2, p):
if p%i == 0:
is_prime=False
break;
if is_prime==True:
print "%d is a Prime Number\n" % p
p=p+1
print('Enter a Number: ')
number=abs(int(input()))
my_List=[0,1]
def is_prime(n):
if n in my_List:
return True
Elif n>=2:
for i in range(2, n):
if n%i == 0:
return False
return True
else:
return False
if is_prime(number):
print("%d is Prime!"%number)
else:
print(number,'is not prime')
Voici un exemple plus complet d'optimisation pour Python 3.
import sys
inner_loop_iterations: int = 0
def is_prime(n):
a: int = 2
global inner_loop_iterations
if n == 1:
return("Not prime")
Elif n == 2:
return("Prime")
while a * a <= n + 1:
inner_loop_iterations += 1
# This if statement reduces the number of inner loop iterations by roughy 50%
# just weeding out the even numbers.
if a % 2 == 0:
a += 1
else:
a += 2
if n % 2 == 0 or n % a == 0:
return ("Not prime")
else:
return ("Prime")
while True:
sys.stdout.write("Enter number to see if it's prime ('q' to quit): ")
n = input()
if not n:
continue
if n == 'q':
break
try:
n = int(n)
except ValueError:
print("Please enter a valid number")
if n < 1:
print("Please enter a valid number")
continue
sys.stdout.write("{}\n".format(is_prime(n)))
sys.stderr.write("Inner loops: {}\n\n".format(inner_loop_iterations))
inner_loop_iterations=0
Ce programme a deux optimisations principales, d’abord il ne fait qu’itérer de 2 à la racine carrée de n et il ne fait que itérer des nombres impairs. En utilisant ces optimisations, j'ai pu découvrir que le nombre 1000000007 n'était primordial que dans 15811 itérations de boucle.
Faisons encore quelques améliorations.
sqrt
et *
), vous n'avez plus besoin de tester un nombre premier.J'ai écrit mon code et chacun des éléments ci-dessus améliorerait mon temps d'exécution du code d'environ 500%.
prime_list=[2]
def is_prime(a_num):
for i in prime_list:
div, rem = divmod(a_num, i)
if rem == 0:
return False
Elif div < i:
break;
prime_list.append(a_num)
return True
for i in range(2, p):
if p%i == 0:
p=p+1
print "%s" % p,
p=p+1
Je vais raconter votre erreur seulement, à la ligne 3, vous augmentez p, mais en fait, ce qui vous manque, c’est votre i si votre i dans l’affaire précédente est disons 13, il vérifiera votre boucle après 13 mais laissera 2,3. , 5,7,11, c’est donc une erreur. C’est ce qui se passe dans le cas d'un 27, votre 13 avant 27 est maintenant 13 et il va maintenant vérifier à partir de 14.et je ne pense pas que vous ayez besoin d'une solution.
def is_prime(n):
if n>=2:
for i in range(2, n):
if n%i == 0:
return False
return True
else:
return False
Pour trouver le numéro de prime
def findprime(num):
count = 0
for i in range(1,num+1):
list1 = []
for ch in range(1,i+1):
if i%1==0 and i%ch==0:
list1.append(ch)
if len(list1)==2:
count += 1
print(i,end=", ")
print()
return count
num2 = int(input("enter a number: "))
result=findprime(num2)
print("prime numbers between 1 and",num2,"are",result)