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')
5 Réponses :
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.
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.
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)
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.
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))
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")
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)
stackoverflow.com/questions/1801391/...
@khelwood Je pense qu'il comprend le concept, mais il cherche le bogue dans son code
supprimer
else
blocelse
et écrire l'instruction d'print
à l'extérieurfor
bouclefor
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 quefor
afin de créer une constructionfor-else
. Si vous placez simplement l'instruction en dehors de la boucle, elle l'imprimera même lorsque la boucle se romptDouble 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.