2013-12-22 3 views
-2
array = [] 
prime_cap = 2_000_000 
prime_nums=(1..prime_cap).map do |p| 
    array = unless p % p-1.downto(1):0 
end 

Я новичок в рубин, и я не понимаю, Что проблема, можете вы объяснить, почему он говорит «без названия: 5: ошибка синтаксиса, неожиданный $ конца, ожидая Kend «когда я пытаюсь запустить его.

+0

не могли бы вы рассказать мне, что вы здесь делаете? P% p-1.downto (1): 0'? –

+1

Что это, если только линия не делает? Особенно двоеточие? –

+0

Извините, вот мой новый код: prime_nums = [] (1..2000000) .each {| p | prime_nums << p, если p% p-1.downto (1) == 0} puts prime_nums.reduce (: +) – Reoxy

ответ

1

Вы не можете использовать операцию modulo с перечислением, вам нужно выполнить итерацию по всем элементам.

prime_nums = [] 
(2..2_000_000).each do |p| 
    prime_nums << p if (p-1).downto(2).none?{ |n| p % n == 0 } 
end 

Обратите внимание на скобки вокруг p-1, а также метод none?, который проверяет состояние для каждого элемента перечисления и возвращает логическое значение. Кроме того, я использовал 2 вместо 1 для итерации, потому что 1 не является простым.

Тем не менее, существуют более эффективные алгоритмы поиска простых чисел. Например, вы можете использовать http://en.wikipedia.org/wiki/Sieve_of_eratosthenes или можете начать проверку с помощью квадратного корня p, а не p-1.

+0

+1 для начала с 2 – steenslag

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