2017-02-04 2 views
0

Cela peut être un post stupide, mais je n'arrive pas à comprendre pourquoi mon code ne fonctionne pas correctement. Pour le compte rendu, j'ai déjà écrit un code différent qui fonctionne, mais je ne comprends toujours pas pourquoi celui-ci ne fonctionne pas.Classique Numéro JS Prime

Pourquoi la seconde instruction if est-elle toujours vraie?

https://jsfiddle.net/vhdh5x3d/2/

/* This code doesn't work... */ 
var testNumber = prompt("Please enter a number you'd like to test"); 

for (var i = 2; i < testNumber; i++) { 
    if (testNumber % i == 0) { 
    document.getElementById("test-results").innerHTML = "Your number, " + testNumber + ", is not a prime number."; 
    } 
    if ((testNumber - 1) == i && testNumber % i != 0) { 
    document.getElementById("test-results").innerHTML = "Congratulations! Your number, " + testNumber + ", is a prime number!"; 
    } 
} 
+0

'x% Mathématiquement x-1' est toujours non-zéro lorsque x'> 2'. Quelle est la condition supposée tester? – JJJ

+0

Vous écrasant le résultat dans chaque boucle for? –

+0

Votre problème de boucle est simple. La première instruction if peut s'avérer vraie plusieurs fois, mais vous frapperez toujours la seconde. Donc, éventuellement, les conditions sont remplies que «je» augmente. Vous avez besoin d'une pause dans votre première déclaration if.De plus, il existe de meilleurs moyens pour obtenir des nombres premiers. – SpYk3HH

Répondre

0

Votre code semble supposer que, étant donné un entier positif testNumber et un autre entier positif i, alors si ((testNumber - 1) == i) && ((testNumber % i) != 0) cela signifie que testNumber est premier.

Cette hypothèse est fausse. Considérons par exemple le cas testNumber = 8 et i = 7. La condition ci-dessus est valable, mais 8 n'est pas un nombre premier.

-1
var testNumber = prompt("Please enter a number you'd like to test"); 
for (var i = 2; i < testNumber; i++) { 
    if (testNumber % i == 0) {  
    break;//already found a working number, so stop 
    } 
} 
//if last iteration reached without breaking its a prime 
document.getElementById("test-results").innerHTML = "Your number, " + testNumber + ", is "+(testNumber==i?"a":"not a")+" prime number."; 

http://jsbin.com/qabivasiyu/edit?console

Comme les commentaires déjà souligné, le second se soit dans la shouldnt boucle, et le premier se doit briser la boucle. Ive a également simplifié votre code un peu ...

+0

pourquoi le downvote? –

0

La seconde if n'est pas toujours vraie, c'est seulement dans la dernière itération de la boucle for, donc ce que vous voyez dans votre code HTML est le message trouvé.

Vous devriez faire quelque chose comme ceci:

var testNumber = prompt("Please enter a number you'd like to test"); 
var prime = true; 
for (var i = 2; i < testNumber; i++) { 
    if (testNumber % i == 0) { 
     prime = false; 

    } 
} 

if (prime == true) 
    document.getElementById("test-results").innerHTML = "Congratulations! Your number, " + testNumber + ", is a prime number!"; 
else 
    document.getElementById("test-results").innerHTML = "Your number, " + testNumber + ", is not a prime number."; 

C'est un algorithme trivial que tester si un nombre est ou non un nombre premier. Vous pouvez trouver beaucoup d'algorithmes différents à cette fin.

0

Je vais résoudre quelques problèmes avec votre code.

  1. Ne jamais utiliser .innerHTML il y a de grands risques de sécurité dans l'utilisation de cette méthode. N'injectez jamais rien qui évalue le code directement d'un utilisateur. Idem pour .eval(). Envisagez de définir .textContent à la place.

  2. Tenez compte ...

    const testNumber = prompt("Please enter a number you'd like to test"); 
    if (testNumber === 1) { 
        document.getElementById("test-results").textContent = 'Sorry, this is not a prime number.' 
    } else if (testNumber === 2) { 
        document.getElementById("test-results").textContent = 'Congratulations, you entered a prime number.' 
    } else { 
    for (var x = 2; x < testNumber; x++) { 
        if (testNumber % x === 0) { 
        document.getElementById("test-results").textContent = 'Sorry, this is not a prime number.' 
        } 
    } 
        document.getElementById("test-results").textContent = 'Congratulations, you entered a prime number.' 
    } 
    
0

Deuxième déclaration Si ne sera pas toujours vrai. Il ira dans votre seconde instruction if uniquement lors de la dernière itération et définira le html. Il sera toujours nécessaire de retourner la valeur une fois que votre condition est remplie ce que vous ne faites pas dans votre code.

Ci-dessous le code fonctionnera:

var testNumber = prompt("Please enter a number you'd like to test"); 

for (var i = 2; i < testNumber; i++) { 
    if (testNumber % i == 0) { 
    document.getElementById("test-results").innerHTML = "Your number, " + testNumber + ", is not a prime number."; 
return; 
    } 
    if ((testNumber - 1) == i && testNumber % i != 0) { 
    document.getElementById("test-results").innerHTML = "Congratulations! Your number, " + testNumber + ", is a prime number!"; 
return; 
    } 
}