Список простых чисел с использованием методов Array - PullRequest
1 голос
/ 08 апреля 2011

У меня есть код для получения списка простых чисел:

def primes_numbers num
    primes = [2]

    3.step(Math.sqrt(num) + 1, 2) do |i|
        is_prime = true     

        primes.each do |p|   # (here)
            if (p > Math.sqrt(i) + 1)
                break
            end

            if (i % p == 0)
                is_prime = false
                break
            end
        end

        if is_prime
            primes << i
        end     
    end

    primes
end

Можно ли переписать код с помощью методов Array (выбрать, собрать и так далее ...)? Что-то вроде:

s = (3..n)
s.select { |x| x % 2 == 1}.select{ |x| ..... }

Проблема в том, что мне нужно перебрать массив результатов (комментарий «здесь») в методе select.

Ответы [ 3 ]

8 голосов
/ 08 апреля 2011

Ruby 1.9 имеет очень хороший Prime класс:

http://www.ruby -doc.org / core-1.9 / classes / Prime.html

НоЯ предполагаю, что вы не заботитесь о каких-либо стандартных классах, но хотите увидеть некоторый код, поэтому здесь мы идем:

>> n = 100 #=> 100
>> s = (2..n) #=> 2..100
>> s.select { |num| (2..Math.sqrt(num)).none? { |d| (num % d).zero? }} 
#=> [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]

Примечание: я написал это так, потому что вы хотели Enumerable методы, для эффективностиради, вы, вероятно, хотите прочитать о простых методах поиска.

1 голос
/ 31 мая 2017

Вы можете перечислить простые числа, как это.

Example Array: ar = (2..30).to_a
ar.select{ |n| (2..n).count{ |d| (n % d).zero? } == 1 }
0 голосов
/ 08 марта 2013

Особенности: Проверьте, что число простое, получите числовые коэффициенты и получите список простых чисел, а также вы можете легко преобразовать его в любой язык, который вы хотите

Так как у Ruby есть собственный класс Prime, вам не о чем беспокоиться

но если вы хотите сделать это самостоятельно, не используя рубиновое ядро ​​

n=100 #=> a

def prime_numbers(n)
  prime_numbers = []
  (1..n).each do |number|
      prime_numbers << number if is_prime(number)
  end
  prime_numbers
end

def is_prime(n)
   if factors(n).count > 2
      return true
   end
   return false
end

# найти факторы числа

def factors(n)
     factors = []
     (1..n).each {|d| factors << d if (n%d).zero?}
     factors
end

Примечание: здесь задействованы три функции, и я специально делаю это для начинающих, чтобы они могли легко понять об этом

Руководство по оптимизации:

1) Вы можете начать цикл с 2 и закончить на n-1, если хотите сохранить итерации

2) используйте основные функции Ruby и наслаждайтесь вещами:)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...