2016-07-28 2 views
2

Я так долго пытался пройти вызов, и, несмотря на то, что я читал несколько решений и советов онлайн, я не могу их правильно применить.Проверка правильности номера Javascript

Инструкции: «Определить функцию isPrime, которая принимает один целочисленный аргумент и возвращает true или false в зависимости от того, является ли целое число простым».

Я пробовал много вещей, но это далеко я был в состоянии получить:

function isPrime(num) { 
    if (num <= 1) return false; 
    if (num === 2) return true; 

    for (var i = 2; i < num; i++) 
    if (num % i === 0) return false; 
    else return true; 
} 

Но тогда я сказал: «9 не простое число.»

Любая помощь будет оценена и спасибо!

+0

Шаг через код. Поскольку 'num' не меньше 1 или равно 2, вы попадаете в цикл. Таким образом, он проверяет '9% 2', который равен' 1', поэтому он попадает в 'else', который возвращает true;' утверждает, что 9 является простым. Который это не так, очевидно. –

ответ

3

Вы должны избегать случая else и возвращаться только после завершения цикла. Хотя количество циклов можно уменьшить, обновив условие до i <= Math.sqrt(num) (как @PatrickRoberts).

function isPrime(num) { 
    if (num <= 1) return false; 
    if (num === 2) return true; 

    // storing the calculated value would be much 
    // better than calculating in each iteration 
    var sqrt = Math.sqrt(num); 

    for (var i = 2; i <= sqrt; i++) 
    if (num % i === 0) return false; 
    return true; 
} 

FYI: В коде на первой итерации цикла num % i === 0 (9 % 2) будет false и возвратит остальное заявление (true).

+2

Теперь поговорим о [Сито Эратосфена] (https://en.wikipedia.org/wiki/Sieve_of_Eratosthenes) ... потому что давайте посмотрим правде в глаза, это ужасно неэффективная реализация. –

+1

Спасибо, ребята, это отлично работает! –

+1

Жаль, что я мог бы возвыситься не один раз, очень хороший ответ. –

4

Проблема с else return true; в вашей петле.

На первой итерации, где i 2, только после того, как вы проверили, что 9 % i не 0, то выполнить else блок и return true.

Вы не должны return true до того, как все итерации не удались return false.

+0

Спасибо за объяснение верного бита, я наконец понял! –

-1

Там должно быть продолжать ключевое слово в вашем для цикла (или опускаем другое заявление), но для обоих, если и еще у вас есть возврат товара ключевое слово. Таким образом, ваш единственным цикл перебирает для я = 2.

function isPrime(num) { 
    if (num <= 1) return false; 
    if (num === 2) return true; 

    for (var i = 2; i < num; i++) 
    if (num % i === 0) return false; 
    else continue; // omittable 

    return true; 
} 

Вы можете сделать много вещей, чтобы увеличить возможности/производительность этого кода. Например, i < num Условие в вашей петле для петли позволяет очень широкий диапазон. Квадратный корень из num будет достаточным для более высокой границы.

+2

, что 'else continue' здесь бесполезен. –

+0

Да, я сейчас, но я так писал, чтобы показать разницу. –

0
function primeNo(){ 
//"number1" is "ID" of HTML input block. 
var num2 = document.getElementById("number1").value; 
var dev = num2/2; 
var i; 
for(i=2; i < dev ; i++){ 
    if(num2%i == 0){ 
     //"ans1" is "ID of <p> where ans needs to display" 
     document.getElementById("ans1").innerHTML = "Not a Prime No"; 
     break; 
    } 
    else{ 
     document.getElementById("ans1").innerHTML = "Prime No"; 
    } 
} 

}

+0

Поскольку «1» не учитывается в списке простых чисел, поэтому цикл начинается с 2. Если число полностью делится до половины его числа, то оно не будет простым. И «Break» используется для выхода, если для получения напоминания «0». –

Смежные вопросы