2017-06-14 1 views
-3

Quelqu'un pourrait expliquer pourquoi changer l'ordre de "i + = 1" change "isPrime" de vrai à faux?Ordre de i + = 1 modifie le résultat de mon code

Scénario 1 imprimera faux alors que Scénario 2 serait imprimer vrai.

Scénario 1:

let number = 643 

var isPrime = true 

var i = 2 

while i < number{ 

    i += 1 

    if number % i == 0{ 

     isPrime = false 
    } 
} 

print(isPrime) 

Scénario 2:

let number = 643 

var isPrime = true 

var i = 2 

while i < number{ 

    if number % i == 0{ 

     isPrime = false 
    } 

    i += 1 
} 

print(isPrime) 
+0

Vous devez réellement expliquer le problème. De même, ne postez jamais d'images de code. Publiez tout le code ici directement sous forme de texte. – Carcigenicate

+1

Les images de code nous sont inutiles. [Ce message Meta] (https://meta.stackoverflow.com/a/285557/62576) a une liste de nombreuses raisons pour lesquelles. Tout le code est du texte, qui peut être facilement copié et collé directement dans votre question ici (et correctement formaté). –

+0

Seyon, merci de remplacer l'image de l'écran par les échantillons de code réels! – Rob

Répondre

2

Selon l'endroit où vous placez votre i += 1, le dernier numéro que vous vérifiez est soit 642 ou 643. 643 % 643 est égal à 0 tandis que 643 % 642 n'est pas égal à zéro.

Raison: Vous vérifiez si i < number. Maintenant, disons i est 642, la condition est remplie, vous entrez dans la boucle et incrémenter i et maintenant il est 643 et maintenant (incorrectement) vérifie si le nombre est divisible par lui-même. Si vous mettez cette instruction à la fin de la boucle, vous faites vos calculs avec 642, puis vous incrémentez, maintenant i < number est faux et 643 % 643 n'est jamais vérifié.

Petite astuce: Il vous suffit de vérifier les numéros de 2 à la moitié du nombre parce qu'il ne peut peut-être un diviseur plus :)

+0

Encore mieux, il suffit de vérifier jusqu'à la racine carrée du nombre car tous les facteurs possibles supérieurs à cela devraient être associés à un nombre inférieur à celui-ci. –

+0

C'est une bonne idée, maintenant que vous dites que c'est logique (je ne l'ai pas remarqué avant!) – Aenadon

1

La différence est que, en faisant i += 1 d'abord, vous êtes incrémenter la valeur de i avant de tester pour voir si elle est divisible et donc vous êtes, en effet, tester les valeurs de 3 ... n plutôt que 2 ... (n-1). Et puisque cette première plage comprend n, il conclut à tort qu'il n'est pas premier.