2013-06-29 4 views
2
function primeNumbers(n) { 
    array = []; 
    for (var i = 2; array.length < n; i++) { 
     for (var count = 2; count < i; count++) { 
      var divisorFound = false; 
      if (i % count === 0) { 
       divisorFound = true; 
       break; 
      } 
     } 
     if (divisorFound == false) {array.push[i];} 
    } 
    return array; 
} 

Когда я запускаю этот код, он, кажется, застревает в бесконечном цикле и ничего не возвращает ... почему?Javascript: найти первые n простых чисел

ответ

3

Попробуйте поместить эту строку перед вторым циклом:

var divisorFound = false; 

Так что эта линия может получить доступ к нему:

if (divisorFound == false) {array.push(i);} 

Прими к сведению FIXED Array.push (I), как сказал NPE. :)

Возможно, вы захотите прочитать о Variable Scope в JavaScript.

+0

Спасибо, поставив строки уага divisorFound = ложь; до того, как вторая петля решила мою другую проблему, эта функция генерировала от 2 до n + 1 простых чисел вместо первых n простых чисел. Можно ли также добавить простые числа таким образом, чтобы они были разделены запятыми, а не символами новой строки? – bard

+0

Рад, что я мог помочь! XD – jomsk1e

1

В вашем коде array.push[i] (с квадратными скобками) не делает то, что вы бы хотели. Он оставляет массив неизменным и возвращает undefined.

Вы имели в виду array.push(i) (с круглыми скобками).

+0

Спасибо, я забываю, что толчок работает с круглыми скобками и не квадратными скобками ... – bard

0

Кроме того, вы никогда не определяете длину для array, поэтому цикл for не может знать, когда остановиться.

0

На самом деле, чтобы найти n простых чисел, это намного более оптимизировано [o (n * sqrt (m))], если вы просто проверите его sqrt (n). Если он не делится квадратным корнем из n, он также не делится на n. вот пример:

(function(n){ 
 
var primes=[]; 
 
    for (var i=1;i<n;i++){ 
 
     var prime=true; 
 
     var rootI=Math.sqrt(i)+1; 
 
     for (var j=2;j<rootI;j++){ 
 
      if (i%j==0) {prime=false;break;} 
 
     }; 
 
     if (prime) primes.push(i); 
 
    } 
 
    document.write(primes.join('-')); 
 
})(100000)

-1

imana97 answare не является правильным, потому что "1" не простое, а "2" является его. Итак, моя исправленная версия:

(function(n){ 
 
var primes=[2]; 
 
    for (var i=3;i<n;i++){ 
 
     var prime=true; 
 
     var rootI=Math.sqrt(i)+1; 
 
     for (var j=2;j<rootI;j++){ 
 
      if (i%j==0) {prime=false;break;} 
 
     }; 
 
     if (prime) primes.push(i); 
 
    } 
 
    document.write(primes.join('-')); 
 
})(100000)

0

Это не самый продвинутый способ сделать это. Использование сита было бы лучше. Однако это довольно прилично и обеспечивает хорошую отправную точку для приближения к задачам с простым номером кода.

/* 
* Get the first n prime numbers 
* 
* @param n Number (integer) 
* @return Array 
* 
*/ 
function getNprimes(n){ 
    const arr = []; 
    let i = 2 

    while (arr.length < n) { 
    if (isPrime(i)) { 
     arr.push(i) 
    } 
    i++ 
    } 
    return arr; 

    /* 
    * @param n (integer) 
    * @return Boolean 
    * 
    */ 
    function isPrime(n) { 

    if (n < 2) { 
     return false 
    } 

    for (let i = 2; i <= Math.sqrt(n); i++) { 
     if (n % i === 0) { 
      return false; 
     } 
    } 
    return true 
    } 

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