Question

J'ai ce bout de code. Et cela fonctionne (Il dit 1 est non-prime).

n = 1
s = 'prime'
for i in range(2, n / 2 + 1):
    if n == 1 or n % i == 0:
        s= 'non-' +s
        break

print s

Mon problème est que si je change la quatrième ligne à: (. Il dit 1 est premier) if n % i == 0 or n == 1:, il ne fonctionne pas

Pourquoi? Depuis que je suis en utilisant or devrait-il que l'un d'eux est vrai si l'ordre ne compte pas?

(je suis encore à apprendre au sujet booléen donc je formulerai une erreur de base.)

Merci à l'avance!

EDIT: Merci pour les réponses; Je ne ai jamais réalisé mon problème avec la fonction range(). Et à propos du code de travail et ne fonctionne pas: Je ne sais pas ce qui est arrivé. J'ai fait une erreur quelque part de le long du chemin (peut-être oublié d'enregistrer avant d'exécuter le script Bien que j'aurais juré que cela a fonctionné différemment. P). Peut-être que je suis juste fatigué ...

Merci pour les réponses toute façon!

Autres conseils

Dans les deux cas, le corps de la boucle ne fonctionne pas, parce que, quand n 'est 1, il ne tombe pas dans la gamme de (n, n / 2 + 1)

Le code affiché indique que 1 est premier (encore une fois, parce que le corps de la boucle n'exécute pas du tout)

i pense que le problème est lorsque n est égal à 1, la boucle est sautée.

D'autres réponses déjà correctement répondu à votre problème spécifique (qui, autrement dit, est que les exécute en boucle que si la n/2 + 1 > 2, qui est, n/2 > 1 qui moyens n > 2 avec division new-style [[python 3 ou les importations appropriées de l'avenir ou drapeaux ...]], avec n > 3 division tronquer style classique).

Wrt la question spécifique que vous avez posée:

  

Depuis que je suis en utilisant ou faut-il que   l'un d'eux est vrai si la   pour ne compte pas?

L'ordre fait count parce que or (comme and) est un opérateur court-circuit: en particulier, or est garantie pour aller à gauche à droite, et l'arrêt si la gauche opérande est vrai (car il n'a pas besoin de savoir sur le bon). Cela n'a pas d'importance pour votre code spécifique, mais il est crucial dans des cas tels que, par exemple:.

if i == 0 or n / i > 3: ...

Si or n'a pas été en cours à droite à gauche (et l'arrêt le plus tôt possible), l'opérande de droite peut s'exécuter même lorsque i est égal à 0 - mais la division soulèverait une exception! Avec les règles de Python, cet extrait de code ne générant des exceptions (si i est un entier, au moins; -)

.

Encore une fois: cela n'a rien à voir avec le problème spécifique que vous rencontrez (voir d'autres réponses et le début de celui-ci), mais il est important pour vous de savoir pour l'avenir, donc, puisque vous avez demandé, je pris la possibilité d'expliquer -)

for n in range(101):
    s = 'prime'
    if n < 2 or not (n & 1): ## not(n & 1) == is even number (last bit 0) == not (n % 2) 
        s = 'non-'+s
    else:
        for i in range(3, int(n**0.5) + 1,2):
             if not(n % i):
                 s= 'non-' +s
                 break
    print "%i is %s" % (n,s)

Vous ne vérifie pas tous les nombres pairs et vous pouvez arrêter la procédure à la racine carrée de n.

scroll top