2016-11-27 1 views
0

Je suis en train d'imprimer tous les nombres premiers dans une gamme de nombres donnés (bas et max, nombres donnés inclus).impression nombres premiers dans une gamme de nombres donnés

Par exemple:

num1 = 10, num2 = 20

>>> 11, 13, 17, 19

Mon code échoue à quelques reprises et je ne peux pas comprendre pourquoi:

num1 = int(input('First number is: ')) 
num2 = int(input('Second number is: ')) 
if num2 <= num1: 
    num1,num2 = num2,num1 
for i in range(num1, num2+1): 
    for p in range(2,int(num2**0.5)+1): 
     if i%p == 0: 
      break 
    else: 
     print(i,' ',end = '') 
print('\n') 

Résultats:

1 à 7 >>> 1 3 5 7 (omet 2)

1 à 30 >>> 11 13 7 1 17 19 23 29 (omet 2,3,5)

1 >>> 60 à 11 13 7 1 17 19 23 29 (omet 2,3,5,7)

0 à 0 >>> 0 (0 gravures -> pas un nombre premier)

0 à 7 >>> 1 3 5 7 (omet 2)

Comment Je corrige ça? Merci beaucoup!

ps. le numéro 1 n'est pas un premier aussi.

+1

Si num2

+0

@ MarkTolonen, je cherchais ça. Merci pour le conseil, j'ai édité la question. –

Répondre

2

L'erreur dans votre code n'a pas été d'avoir un i dans la deuxième partie de l'intérieur pour la plage en boucle par opposition à num2

num1 = int(input('First number is: ')) 
num2 = int(input('Second number is: ')) 
if num2 > num1: 
    num1, num2 = num2, num1 
for i in range(num1, num2+1): 
    if i == 0 or i == 1: continue 
    for p in range(2,int(i**0.5)+1):  # the second part should be int(i**0.5) + 1, not int(num2**0.5)+1 
     if i%p == 0:  
      break  

    else: 
     print(i,' ',end = '') 

Aussi, plutôt que d'avoir deux branches pour num1 < num2 et l'inverse , vous pouvez faire quelque chose comme ci-dessous. En outre, en termes de conception de code, il serait préférable de décomposer cela légèrement en une méthode is_prime. De cette façon, si vous voulez écrire un testeur de primalité plus rapide, vous pouvez facilement modifier la fonction d'assistance plutôt que de jouer avec le code principal.

def is_prime(num): 
    if i == 1: return False 
    for p in range(2,int(num**0.5)+1): 
     if num % p == 0: 
      return False 
    return True 

inp1 = int(input('First number is: ')) 
inp2 = int(input('Second number is: ')) 

num1 = min(inp1, inp2) 
num2 = max(inp1, inp2) 

for i in range(num1, num2+1): 
    if is_prime(i): 
     print(i,' ',end = '') 

print('\n') 
+0

Certaines de vos "corrections" sont incorrectes. Le 'for' /' else' n'est pas incorrect. C'est une construction valide en Python. Le 'else' s'exécute si' for' se termine, ce qui signifie que le nombre était premier. La pause arrête le 'for' dès que le nombre n'est pas premier ... aucune raison de mettre' prime = False' et continuer à vérifier. –

+0

@MarkTolonen C'est sauvage. Je n'en avais aucune idée. Merci, je vais éditer la réponse. Clairement j'ai fait trop C++ – gowrath

+0

FYI, 'while' /' else' est aussi valable. –

1

Vous n'avez pas considéré la division du nombre par le nombre lui-même. ie Lorsque l'intervalle était de 1 à 30, sqrt (30) +1 = 5 + 1 = 6, tous les ns inférieurs à six avaient un cas où ils étaient divisés par le nombre lui-même en 2% 2,3% 3 ... i% je.

Solution serait de modifier la plage de boucle intérieure pour que:

for i in range(num1, num2+1): 
    for p in range(2,int(i**0.5)+1): #Change num2 to i to avoid i%i 
     if i%p == 0: 
      break 
    else: 
     print(i,' ',end = '') 

Il est préférable de faire abstraction du code comme celui fait par gowrath pour éviter les erreurs.