33 votes

L’imprimante numéro premier s’arrête à 251, pourquoi?

J'ai commencé à apprendre Python aujourd'hui et j'ai eu l'idée de créer un programme qui imprime tous les nombres premiers compris entre 0 et 10 000. J'ai réussi à faire en sorte que mon programme imprime tous les nombres premiers jusqu'à 251, moment auquel il arrête d'imprimer des nombres. . Pourquoi fait-il cela?

Voici le code:

 for numberToCheck in range(2,10000):
    divider = 2
    while numberToCheck > divider:
        if numberToCheck % divider is 0:
            break
        else:
            divider += 1
    if numberToCheck is divider:
        print(numberToCheck, "is a prime number.")
 

74voto

Bakuriu Points 22607

Le problème est que vous utilisez is au lieu de ==. L' is opérateur effectue l'identité de l'objet de la comparaison, qui "arrive à travailler" pour tous les numéros ci-dessous 256 en raison de la mise en œuvre de détails. 251 est le plus grand, le premier en-dessous de 256 (vérifier ici, le prochain premier est 257) et après que l' is retours False:

>>> 254 + 1 is 255
True
>>> 255 + 1 is 256
True
>>> 256 + 1 is 257
False

L'opérateur d'égalité est - ==:

>>> 254 + 1 == 255
True
>>> 255 + 1 == 256
True
>>> 256 + 1 == 257
True

12voto

Ajeet Shah Points 61

Utiliser == pour vérifier l'égalité de nombres:

for numberToCheck in range(2,10000):
    divider = 2
    while numberToCheck > divider:
        if numberToCheck % divider is 0:
            break
        else:
            divider += 1
    if numberToCheck == divider:
        print(numberToCheck, "is a prime number.")

Is opérateur est utilisé pour vérifier l' id de deux objets en == opérateur de vérifier leurs valeurs.

Python implémente un Tableau d'entiers pour des valeurs entre -5 de 256, et lorsque vous créez un objet int dans cette gamme, vous obtenez une référence à la matrice de mise en œuvre. C'est pourquoi, id de tous les nombres entiers les objets de cette gamme est le même, mais c'est différent pour les entiers objets en dehors de cette plage, comme on le voit ci-dessous:

>>> a = -6
>>> b = -6
>>> a is b      # a and b has different id
False

>>> a = -5
>>> b = -5
>>> a is b      # a and b has same id
True

>>> a = 256
>>> b = 256
>>> a is b      # a and b has same id
True

>>> a = 257
>>> b = 257
>>> a is b      # a and b has different id
False

Et c'est la raison, votre programme imprime les nombres premiers jusqu' 251 , mais pas le prochain premier 257 et par la suite, cependant, votre programme fonctionne jusqu' numberToCheck atteint 9999.

Aussi, vous pouvez envisager un algorithme plus rapide pour générer des nombres premiers, comme le Crible d'Eratosthène.

Fondamentalement, vous devez vérifier la divisibilité de l' numberToCheck avec tous les nombres premiers entre 2 et ( déjà trouvé le premier ou la racine carrée de l' numberToCheck, s'il est moins élevé ).

3voto

Benoît Latinier Points 1696

L'erreur est dans le dernier if. Changement de

if numberToCheck is divider:

pour

if numberToCheck == divider:

Explication: is des tests si les refences sont égaux alors qu' == vérifier l'égalité de valeurs (plus précisément, il s'appelle __eq__ méthode sur vos éléments)

Les raisons pour lesquelles vous avez de la première amorce d'imprimer jusqu'à 251 est parce que python cache tous les petits entiers.

Par exemple:

>>> 100 == 10**2
True
>>> 100 is 10**2
True
>>> 1000 == 10**3
True
>>> 1000 is 10**3
False

(Exemple tiré d' ici) Vous devez utiliser is seulement de vérifier les références des objets qui ne devraient pas seulement être égal, mais dans la même instance) ou de le comparer à d' None.

3voto

bcho04 Points 346

Ne comparez jamais les entiers avec is . Toujours utiliser == .

== devrait être utilisé pour comparer les chiffres.

Voici le code fixe:

 for numberToCheck in range(2,10000):
divider = 2
while numberToCheck > divider:
    if numberToCheck % divider == 0:
        break
    else:
        divider += 1
if numberToCheck == divider:
    print(numberToCheck, "is a prime number.")
 

3voto

direprobs Points 2127

Le problème, c'est que vous avez utilisé is. is ne pas vérifier l'égalité, il vérifie un objet de l'identité (adresse mémoire); est l'objet d'un même objet b?

Reportez-vous à ces questions:

Est-il une différence entre `==` et `est` en Python?

"est" l'opérateur se comporte de manière inattendue avec des entiers

Pourquoi (0-6) est -6 = False?


Pour résoudre votre problème:

def prime(numberToCheck):
    divider = 2
    while numberToCheck > divider:
        if numberToCheck % divider == 0:
            break
        else:
            divider += 1

        if numberToCheck == divider:
            print(numberToCheck, "is a prime number.")

Un peu trivial note ici, mais pourrait être crucial dans les applications plus importantes: j'ai créé une fonction appelée prime à maximiser le code de la réutilisation. Maintenant, vous pouvez passer à l' prime fonction quel que soit le nombre que vous aimez pour vérifier si il est premier ou non, bien mieux que le codage en dur des le nombre que vous souhaitez tester!

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X