Ruby - определить, является ли число простым числом - PullRequest
15 голосов
/ 29 августа 2010

Я работаю над проблемами на Project Euler , чтобы научиться программировать на Ruby. Я знаю, что для этого есть встроенная функция , но я избегаю встроенных функций, которые помогают мне учиться.

Поэтому мне нужно написать метод, чтобы определить,число простое.Первый метод работает, а второй нет.Кто-нибудь может объяснить, почему?

 def is_prime n
  for d in 2..(n - 1)
   if (n % d) == 0
    return false
   end
  end

  true
 end

 def is_prime2 n
  foundDivider = false
   for d in 2..(n - 1)
    foundDivider = ((n % d) == 0) or foundDivider
   end
  not foundDivider
 end

Ответы [ 13 ]

18 голосов
/ 29 августа 2010

Это потому, что = имеет более высокий приоритет, чем or.См. Таблица приоритетов операторов Ruby ниже (от старшего к младшему):

[ ] [ ]=
**
! ~ + -
* / %
+ -
>> <<
&
^ |
<= < > >=
<=> == === != =~ !~
&&
||
.. ...
? :
= %= { /= -= += |= &= >>= <<= *= &&= ||= **=
defined?
not
or and
if unless while until
begin/end

Проблемная строка анализируется как ...

(foundDivider = ((n % d) == 0)) or foundDivider

...что, конечно, не то, что вы имеете в виду.Есть два возможных решения:

Принудительно, чтобы приоритет был тем, что вы действительно имеете в виду ...

foundDivider = (((n % d) == 0) or foundDivider)

... или используйте вместо него оператор ||, который имеет более высокий приоритет, чем=:

foundDivider = ((n % d) == 0) || foundDivider
9 голосов
/ 03 мая 2014

Ruby поставляется с предопределенными классами, такими как Prime. Все, что вам нужно сделать, это включить этот класс в ваш проект.

require 'prime'

Затем вы можете использовать некоторые методы Prime, например first , чтобы получить первые x простых элементов:

Prime.first(5) # Ret => [2, 3, 5, 6, 11]

Или вы могли бы сделать что-то вроде этого:

Prime.each(100) do |prime|
  p prime # Ret => [2, 3, 5, 7, 11, ..., 97]
end

Надеюсь, вы найдете это полезным.

5 голосов
/ 13 ноября 2014
def prime(n)
  (2..n/2).none?{|i| n % i == 0}
end

Простое число - это любое число, которое не имеет положительных делителей, кроме себя и 1.

4 голосов
/ 30 апреля 2015

Найдите простые числа из цикла:

def get_prime_no_upto(number)
  start = 2
  primes = (start..number).to_a
  (start..number).each do |no|
    (start..no).each do |num|
      if ( no % num  == 0) && num != no
        primes.delete(no)
        break
      end
    end
  end
  primes
end

и используйте его, как показано ниже:

puts get_prime_no_upto(100)

Ура!

3 голосов
/ 17 июня 2016
def prime? n
  (2..Math.sqrt(n)).none? {|f| n % f == 0}
end

Диапазон факторов должен начинаться с 2 и заканчиваться корнем квадратным из n, потому что каждое число делится на единицу, и ни одно число не делится на два числа, больше его квадратного корня.

Объяснение: Непростое число является произведением двух чисел.

n = f1 * f2

n всегда делится на его квадратный корень, поэтому оба значения f1 и f2 не могут бытьбольше, чем квадратный корень из n, иначе f1 * f2 будет больше, чем n.Следовательно, по меньшей мере один фактор меньше или самое большее равен Math.sqrt(n).В случае нахождения простых чисел необходимо найти только один фактор, поэтому мы должны перейти от 2 к квадратному корню из n.

3 голосов
/ 30 мая 2015

Вот код, который предложит вам ввести номер для первичной проверки:

puts "welcome to prime number check"
puts "enter number for check: "
  n = gets
  n = n.to_i

def prime(n)
  puts "That's not an integer." unless n.is_a? Integer
  is_prime = true
  for i in 2..n-1
    if n % i == 0
      is_prime = false
    end
  end
  if is_prime
    puts "#{n} is prime!"
  else
    puts "#{n} is not prime."
  end
end

prime(n)
2 голосов
/ 11 апреля 2016

На основании ответа Дармуза, но с учетом крайних случаев

def prime? (n)
    if n <= 1
        false
    elsif n == 2
        true
    else 
        (2..n/2).none? { |i| n % i == 0}
    end
end
1 голос
/ 24 января 2015

FYI - re: DarkMouses простой метод выше - я нашел его действительно полезным, но есть несколько ошибок (я думаю!), Которые нужно объяснить:

Это должны быть круглые скобки, а не квадратные скобки ...В противном случае вы получите TypeError

Range can't be coerced into Fixnum (TypeError)

Во-вторых, это первое двоеточие перед 'false' также приведет к ошибке.Это неправильный синтаксис, насколько я знаю.Избавься от этого.

Наконец, я думаю, ты понял это неправильно?Если вы исправите ошибки, о которых я упоминал, он вернет истину, если это не простое число, и ложь, если это так.

Думаю, вы можете вообще отбросить троичный оператор, и просто выполните:*

Очевидно, что это не охватывает крайние случаи (0,1,2), но давайте не будем расщеплять волосы.

... Для тех, кто любит расчесывание волос, вот мое полное решение этой проблемы:

    def prime?(n)
      return false if n < 2
      (2..Math.sqrt(n)).none? {|num| length % num == 0}
    end

Надеюсь, я ничего не пропустил :)

0 голосов
/ 17 мая 2019
def prime(n)
    pn = [2]
    if n < 2
       return false

   else

     (2..n).each do |i|
       not_prime = false

        (2..Math.sqrt(i).ceil).each do |j|
           not_prime = true if i % j == 0    
        end
       pn.push(i) unless not_prime
    end

 end

return pn

end

p штрих (30) дает

[2, 3, 5, 7, 11, 13, 17, 19, 23, 29]

0 голосов
/ 17 ноября 2018
def prime?(n)
  if n <= 1
  return false

  else (2..n-1).to_a.all? do |integer|
   n % integer != 0

   end
  end
end

От моего прайма? лаборатория Началось с исключения всех целых чисел, меньших или равных 1.

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