2017-02-04 3 views
0

Это может быть глупый пост, но я не могу понять, почему мой код работает неправильно. Для записи я уже писал другой код, который работает, но я до сих пор не понимаю, почему этого нет.Classic JS Prime Number

Почему заявление второго if всегда передается как истинное?

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

Математически 'х% х-1' всегда отлична от нуля, когда' х> 2'. Какое условие должно проверяться? – JJJ

+0

Вы переопределяете результат в каждом цикле? –

+0

Ваша проблема с циклом проста. Первый оператор if может оказаться истинным много раз, но вы всегда будете поражать второй. Поэтому в конечном итоге условия выполняются как 'i'. Вам нужно перерыв в вашем первом заявлении if.Кроме того, есть намного лучшие способы получить простые числа – SpYk3HH

ответ

0

Ваш код, кажется, предполагает, что, учитывая положительное целое testNumber и другое положительное целое число i, то если ((testNumber - 1) == i) && ((testNumber % i) != 0), что означает, что testNumber первична.

Это предположение неверно. Рассмотрим, например, случай testNumber = 8 и i = 7. Приведенное выше условие имеет место, однако 8 не является простым числом.

-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

В комментариях уже отмечалось, второй, если не должно быть в течение цикла, а первый, если необходимо разорвать петлю. Ive также упрощена ваш код немного ...

+0

почему downvote? –

0

Второй if не всегда верен, он находится только в последней итерации цикла for, поэтому то, что вы видите в своем html, является основным найденным сообщением.

Вы должны сделать что-то вроде этого:

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."; 

Это тривиальный алгоритм проверки, является ли число или не простое число. Для этой цели вы можете найти множество различных алгоритмов.

0

Я расскажу о нескольких проблемах с вашим кодом.

  1. Никогда не используйте .innerHTML, при использовании этого метода существуют большие риски для безопасности. Никогда не вводите ничего, что оценивает код непосредственно у пользователя. То же самое касается .eval(). Рассмотрим вместо этого значение .textContent.

  2. Рассмотрим ...

    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

Второе Если заявление не будет верно всегда. Он войдет в ваш второй оператор if только во время последней итерации и установите html. Всегда необходимо вернуть значение, как только ваше условие будет выполнено, что вы не делаете в своем коде.

Ниже код будет работать:

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; 
    } 
}