2013-07-03 2 views
-2

Я пытаюсь найти ПЕРВОЕ 100 ПРЕМЬЕР-НОМЕРОВ. Не простые числа от 1 до 100. Мне нужна помощь с этим кодом.Поиск первых 100 простых чисел

var p = function(n){ 
    var x = Math.sqrt(n); 
    if(n==2){return 2;} 
    else if (n % 2===0){return 0;} 
    var i=3; 
    for(i=3; i < x; i+=2){ 
      if(n%i===0){return 0;} 
    } 
    return n; 
}; 


var firstKPrime = function(k){ 
     var i=1; 
     var arr =[]; 
     for(i = 1; i < k+1; i++){ 
       if(i==2){arr.push(p(i));} 
       if(i>2 && i%2!==0){ 
         if (p(i)>1){arr.push(p(i));}} 
        } 
       return arr; 
      }; 

       var fmt = function(arr){ 
        return arr.join(","); 

      }; 

      var k = 100; 
      console.log("firstKPrime(" + k + ")"); 
      console.log(fmt(firstKPrime(k))); 

Я не хочу, чтобы найти простые числа от 1-100 помочь мне с модифицирующими это

+2

запустить петлю. increment 'i', если это простое число, добавьте его в массив, проверьте, есть ли' .length' массива. Когда '.length = 100' останавливает цикл. – ntgCleaner

+2

Именно то, что вам нужно? http://stackoverflow.com/help/how-to-ask – paddy

+0

Выполнение домашней работы в последнюю минуту? ; -p – bitfed

ответ

-1

Я хотел бы использовать свойство arr.length, чтобы узнать, сколько простых чисел было найдено, и сравнить параметра к ,

Что-то вдоль этих линий:

var firstKPrime = function(k){ 
var i=1; 
var arr =[]; 
while (arr.length < k) 
{ 
    if(i == 2) 
    { 
     arr.push(p(i)); 
    } 

    if(i>2 && i%2!==0) 
    { 
     if (p(i)>1) 
     { 
      arr.push(p(i)); 
     } 
    } 

    i++; 
} 

return arr; 
}; 
+0

Почему бы и нет? Заметим, что функция p (i) не определена в этом фрагменте кода, и я предположил, что она работает с ** исходным кодом, предоставленным автором **. Этот фрагмент кода находит простые числа в определенном диапазоне, поэтому функция p (i) должна уже работать. Исходя из этого, этот код делает как можно меньше изменений в исходном коде, как я мог думать. Ваш downvote и комментарий делают меня довольно грустным. – Topaiyo

+0

Так что я просто проверил его снова. Я понял, что забыл один i ++; в цикле, но если все это было не так, вы могли бы просто так сказать ... Кроме того, код работает абсолютно нормально. Действительно странное поведение с вашей стороны. – Topaiyo

0

Вместо того, чтобы использовать для (I = 1, я < к + 1, я ++)
Использование

j = 1; 
i=2; 
while(j <= k) 
{ 
    if(i==2){arr.push(p(i));} 
       if(i>2 && i%2!==0) 
       { 
         if (p(i)>1) 
         {arr.push(p(i));j++;} 
       } 
    i++; 
} 
7
var first100primes = [2,3,5,7,11,13,17,19,23,29,31,37,41,43,47,53,59,61,67,71,73,79,83,89,97,101,103,107,109,113,127,131,137,139,149,151,157,163,167,173,179,181,191,193,197,199,211,223,227,229,233,239,241,251,257,263,269,271,277,281,283,293,307,311,313,317,331,337,347,349,353,359,367,373,379,383,389,397,401,409,419,421,431,433,439,443,449,457,461,463,467,479,487,491,499,503,509,521,523,541]; 

Хехе ...

С серьезностью, однако, вы должны следовать следующему патту Эрн:

  • Создание массива primes и целое i=1
  • Хотя primes.length < 100, сделайте следующее:
    • Increment i
    • Для всех целых j между 2 и sqrt(i):
      • If i % j == 0 затем продолжить верхний контур
    • Если вы достигли этой точки, то это простое число, поэтому нажмите i на primes

Пример реализации выше:

(function() { 
    var primes = [2]; 
    window.getNprimes = function(n) { 
     var i = primes.length == 1 ? 1 : primes[primes.length-1], j, l; 
     main: 
     while((l=primes.length) < n) { 
      i += 2; 
      for(j=0; j<l; j++) { 
       if(i % primes[j] == 0) continue main; 
      } 
      primes.push(i); 
     } 
     return primes.slice(0,n); 
    }; 
})(); 

Это, как оптимальным, так как я может подумать, в частности, если вы вызываете getNprimes(100) несколько раз, он будет вычислять его только в первый раз и просто вернуть тот же результат в следующий раз.

+0

Семенные штрихи с «2» и приращением i на 2. – Jesse

+1

Вам не нужно проверять с помощью 'j' между 2 и' sqrt (i) '. Просто проверьте все ранее найденные простые числа (это Сито Эратосфена). – Barmar

+0

@Barmar Спасибо, немного без проблем, когда я думаю об этом! Отредактированный код. –

1

Если вы не возражаете, используя библиотеку как Lazy.js, то вы можете просто сделать это:

var first100primes = Lazy 
    .generate(infiniteSequence(2)) 
    .filter(isPrime) 
    .take(100) 
    .toArray(); 

function infiniteSequence(start, step) { 
    if (typeof start === "undefined") start = 0; 
    if (typeof step === "undefined") step = 1; 

    return function (i) { 
     return start + i * step; 
    }; 
} 

function isPrime(n) { 
    var sqrtn = Math.sqrt(n); 

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

Это все. Если вы не хотите использовать Lazy.js, то вы могли бы сделать это вместо:

var first100primes = [], n = 2; 
do if (isPrime(n++)) first100primes.push(n - 1); 
while (first100primes.length < 100); 

function isPrime(n) { 
    var sqrtn = Math.sqrt(n); 

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

Смотреть демо: http://jsfiddle.net/a3mKv/