0
votes

vérification du nombre premier en python

J'ai écrit ce programme pour vérifier la météo le non. est premier ou non, mais cela montre que le nombre est premier plusieurs fois. Comment puis-je le résoudre

Pour vérifier la météo, le nombre est premier ou non.

num = int(input("please enter the number you want to check\n"))

if num > 1:
    for i in range(2, num):
        if (num % i) == 0:
            print("the number is not prime")
            print(str(i) + " times " + str(num//i) + " is "+ str(num))
            break
        else:
            print("the number is prime")
elif(num == 1):
    print("the number is not prime")
else:
    print('enter a positive value')


8 commentaires

stackoverflow.com/questions/1801391/...


@khelwood Je pense qu'il comprend le concept, mais il cherche le bogue dans son code


supprimer else bloc else et écrire l'instruction d' print à l'extérieur for boucle for


Essayez de trouver par vous-même - avec un débogueur - pourquoi 4 est considéré comme un nombre premier.


Le bloc else devrait probablement être indenté au même niveau que for afin de créer une construction for-else . Si vous placez simplement l'instruction en dehors de la boucle, elle l'imprimera même lorsque la boucle se rompt


Double possible de Quel est le meilleur algorithme pour vérifier si un nombre est premier?


@dome Je ne pense pas, j'interprète sa question non pas comme une question algorithmique sur la façon de vérifier, mais comme une chasse aux bogues dans son code


Oui, tu as raison, je retire le drapeau.


5 Réponses :


0
votes

Utilisez une variable, par exemple flag et initialisez-le à 0. Si le nombre n'est pas premier, c'est-à-dire i% 2 == 0, définissez le drapeau sur 1 et interrompez, sinon drapeau = 0.

Après cela, sortez du bloc for, et avec l'aide de l'affichage de la condition if, le nombre est premier ou non. C'est-à-dire que si flag == 0, le nombre est premier sinon non.


2 commentaires

en théorie ok, mais si un dernier else fixe est à nouveau à zéro? .. mieux vaut commencer par zéro et ne changer que si une condition non-première est trouvée


J'ai oublié de mentionner la déclaration de rupture. Devrait fonctionner maintenant.



1
votes

Votre problème est que l' else partie de votre boucle for est fausse. Vous imprimez "the number is prime" chaque fois qu'un contrôle de division échoue, pas seulement à la fin.

J'ai ajouté un booléen isPrime qui suit si une seule vérification a échoué. Seulement si aucun d'entre eux n'échoue, vous pouvez imprimer que le nombre est premier.

num = int(input("please enter the number you want to check\n"))

if num > 1:
    for i in range(2, num):
        if (num % i) == 0:
            print("the number is not prime")
            print(str(i) + " times " + str(num//i) + " is "+ str(num))
            break
    else:
        print("the number is prime")
elif(num == 1):
    print("the number is not prime")
else:
    print('enter a positive value')

Vous pouvez simplifier encore plus cela, avec une construction de python appelée for-else (crédits à @ TheGamer007 ):

num = int(input("please enter the number you want to check\n"))

if num > 1:
    isPrime = True
    for i in range(2, num):
        if (num % i) == 0:
            print("the number is not prime")
            print(str(i) + " times " + str(num//i) + " is "+ str(num))
            isPrime = False
            break
    if isPrime:
        print("the number is prime")
elif(num == 1):
    print("the number is not prime")
else:
    print('enter a positive value')

Cela fonctionne parce que Python for -loops peut avoir une else: voici, seuls déclencheurs si vous ne break hors de la boucle.

C'est peut-être exactement ce que vous essayiez de faire. Dans ce cas, tout ce que vous avez fait de mal était votre indentation.

En outre, d'un point de vue algorithmique, il existe de bien meilleures façons de vérifier. Une première amélioration simple est que vous n'avez pas besoin de vérifier range(2,num) , mais uniquement range(2, int(math.sqrt(num))+1)


3 commentaires

Vous pouvez ignorer la variable isPrime supplémentaire si vous utilisez un bloc for-else . Il ne s'exécutera que si la boucle n'a pas été interrompue. Cela aurait pu aussi être l'intention initiale d'OP.


Oh, pour être honnête, après des années de programmation python, c'est la première fois que j'entends parler de la construction for-else. Fascinant. Je mettrai à jour la réponse.


J'ai ressenti la même chose quand je l'ai trouvé pour la première fois ici sur SO.



0
votes

Tout ce dont vous avez besoin pour déterminer si un nombre est premier ou non, c'est de trouver 1 nombre supérieur ou égal à 2 qui divise le nombre.

Dans votre boucle, vous imprimez un message qui dit "le nombre est premier" pour chaque nombre qui ne divise pas le nombre donné.

Par exemple, si vous voulez vérifier si le nombre 9 est premier ou non, vous allez boucler tous les nombres de 2 à 8 et vérifier s'ils peuvent diviser 9. Donc dans votre boucle for, le nombre 5 par exemple -> 9% 5 ! = 0 -> Le message "le nombre est premier" apparaîtra, ce qui est faux.

Le code ci-dessous montre comment vous pouvez utiliser un booléen pour lever un drapeau lorsque le nombre n'est PAS premier.

num = int(input("please enter the number you want to check\n"))
isPrime = True
while num < 1:
    int(input("enter a positive value\n"))
if num == 1:
    print("the number is not prime")
    return
for i in range(2, num):
    if (num % i) == 0:
       isPrime = False
       break
print(str(num) + " is prime? " + str(isPrime))


0 commentaires

0
votes

Je suggérerais la mise en œuvre suivante

Nous avons seulement besoin de vérifier / boucler jusqu'à une racine carrée du nombre et non le nombre lui-même et est donc plus rapide.

La structure for-else vous débarrasse de l'indicateur isPrime dont vous avez autrement besoin. La façon dont cela fonctionne est que si la boucle se termine normalement sans se rompre (ce qui signifie que vous n'avez pas trouvé ce que vous cherchez), elle passe dans l' else

import math

num = int(input("please enter the number you want to check\n"))

if num > 1:
    for i in range(2, int(math.sqrt(num))+1):
        if (num % i) == 0:
            print("the number is not prime")
            print(i, "times", num//i, "is", num)
            break                                                     
    else:        
        print("the number is prime")
else:                                
    print("the number is not prime")


0 commentaires

1
votes

Voici mon code pour vérifier si un nombre est premier ou non, j'espère que cela aide

# Program to Check whether given number is prime

def isPrime(number):
    limit = int(number/2) # limit indicates how many times we need to run the loop
    flag=0                # to keep track whether the number is prime or not
    if number==0 or number==1:
        print(f"The Given Number {number} is Not Prime")
        return
    for i in range(2,limit+1):
        if number%i==0:
            flag=1
            break
    if flag==0:
        print(f"The Given Number {number} is Prime")
    else:
        print(f"The Given Number {number} is Not Prime")

isPrime (1)


0 commentaires