2015-03-15 2 views
0

Итак, я определяю, какое простое число, а что нет, но я просто не понимаю, как это получается с правильным выходом.Сортировка чисел для циклов

Итак, первый начинается с 2 и заканчивается на 1 до 100. Легко. Но второй начинается с нуля, а циклы - самим y +, это имеет смысл, но при определении простых чисел это должно испортиться, по крайней мере, я думал, что это как: 1 + 3 = 4 или 2 + 4 = 6 или 3 + 5 = 8

и что работает, но что происходит, скажем, 15? это не простое число. Как числа, подобные сортировке в цикле?

var prim = []; 
var notprim = []; 
    for(var x = 2; x <= 100; x++){ 
    if(!notprim[x]){ 
     prim.push(x); 


     for(var y = 0; y <= 100; y = y+x){ 
      notprim[y] = true; 
      document.write(y); 
     } 
    } 
    } 
+0

Каков ваш алгоритм? Можете ли вы это описать? –

+0

Алгоритм имени является первыми ситами. ссылка на wiki http://en.wikipedia.org/wiki/Generating_primes#Prime_sieves – balajisoundar

ответ

1

У вас есть массива , что вы можете себе представить, как [undefined × 100] и !!undefined === false, т.е. неопределенного является falsy

Если для некоторого числа n у вас есть notprim[n]falsy, вы берете на себя это означает, что n должно быть простым числом и добавить его в другой массив, prim

Затем вы устанавливаете все кратные n быть в truthy, т.е. если n является 3, вы установили notprim[n * x] = true;, т.е. 0, 3, 6, 9, 12, и т.д.

затем вы посмотрите на следующий индекс falsy в , чтобы начать снова


причина, по которой первый цикл звезды TS в 2 потому, что 2 является первым простое число, начиная с 1 или 0 бы вызвать предположение о том, что «notprim[n]falsy означает n простое число» потерпеть неудачу

Отлично, но как насчет другой петли ? Ну, один из способов пройти через n * x - это добавить n себе x раз. Когда вы думаете об этом таким образом, вы можете ограничить, насколько высоко вы идете, не зная, максимальный множитель заранее, глядя на бегущий t ОБЩЕГО, например, в for петли

for (t = 0; t <= 100; t = t + n) 
    // t ∈ nℤ, 0 <= t <= 100 

, но что происходит, можно сказать, 15?

Когда вы нашли простое число 3, вы тогда флаг все кратные 3 быть исключены из поиска простых чисел. 15 является кратным 3, поэтому он помечен как не является простым.Поэтому ваш if (!notprim[x]) не проходит


Вы можете уменьшить число итераций нужен этот код, исключив 0 и x из второго for цикла; то есть начать с индекса y = 2 * x

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