-2
votes

J'ai besoin de trouver des nombres premiers dans cette liste

Je souhaite trouver les nombres premiers dans une liste avec les spécifications suivantes: A) Si les chiffres sont prêts, le code doit imprimer "[numéro] est un nombre premier." B) Si le nombre n'est pas un nombre premier, il devrait imprimer "[numéro] n'est pas un nombre premier" et un facteur de ce numéro, autre que 1 et le nombre lui-même: "[facteur] est un facteur de [nombre ] ".

check_prime = [26, 39, 51, 53, 57, 79, 85].
for num in check_prime:
    for i in range(2, num):
        if (num % i) == 0:
            print("{} is NOT a prime number, because {} is a factor of {}".format(num, i, num))
            break

    if i == num -1:    
        print("{} IS a prime number".format(num))


1 commentaires

Vous avez raison - la boucle pour la boucle peut avoir un bloc pour attraper le cas où pause n'est jamais exécuté. Je suppose que la personne qui a écrit ce code ne savait pas cela, alors ils essaient de tester si i est arrivé à la dernière étape de la plage. Mais c'est buggy, car si num est 2 (qui est prime), i ne sera jamais incrémenté.


3 Réponses :


1
votes

La réponse est que plage (2, num) génère des numéros à partir de 2 jusqu'à num-1 car plage (0, n) Génère des nombres en général de 0 à N-1. Donc, votre i fonctionnera de 2 à num-1 . C'est pourquoi vous vérifiez si i == num -1: Pour voir si toutes les valeurs de i ont été utilisées pour vérifier le numéro principal.


0 commentaires

1
votes

C'est ce code bâclé.

La logique est que le nombre est prime si et seulement si vous avez suivi tous les facteurs possibles inférieurs au nombre. Dans ce cas, i == num-1 code>. P>

Il existe de meilleurs moyens de déterminer si un nombre est élevé. Vous pouvez rechercher "Trémates Prime Python" et obtenir de nombreux hits avec un meilleur code et une logique plus simple. P>

Par exemple, c'est plus clair: P>

import math

check_prime = [26, 39, 51, 53, 57, 79, 85].
for num in check_prime:
    is_prime = True
    for i in range(2, int(num**0.5) + 1):
        if (num % i) == 0:
            is_prime = False
            break

    if is_prime:    
        print("{} IS a prime number".format(num))
    else:
        print("{} is NOT a prime number, because {} is a factor of {}".format(num, i, num))


1 commentaires

MATH.SQRT retourne un flotteur, mais plage nécessite des arguments entier. Vous pouvez également effectuer une racine carrée sans aucune importation avec num ** 0.5 . De plus, is_prime définit essentiellement un drapeau pour voir si la boucle s'arrête avec un BAISE , qui est ce que pour..else fait fondamentalement.



1
votes

Puisque la boucle interne iTerate i code> sur plage (2, num) code>, i code> deviendrait num - 1 code > En fin de compte si la boucle ne rencontre pas un break code> en raison de la recherche d'un diviseur, ce qui est déterminé qu'un nombre premier est déterminé.

Alternativement, vous pouvez utiliser le pour-ele Construction Pour atteindre l'objectif de déterminer que le numéro est une prime uniquement si la boucle ne rencontre pas un break code> d'une manière plus propre: p>

for num in check_prime:
    for i in range(2, num):
        if (num % i) == 0:
            print("{} is NOT a prime number, because {} is a factor of {}".format(num, i, num))
            break
    else:
        print("{} IS a prime number".format(num))


0 commentaires