Ruby - определить, является ли число простым

У меня проблемы с 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

Ответы

Ответ 1

Это потому, что = имеет более высокий приоритет, чем 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

Ответ 2

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

require '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

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

Ответ 3

def prime(n)
  (2..n/2).none?{|i| n % i == 0}
end

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

Ответ 4

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

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)

Ура!

Ответ 5

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

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

def prime(n)
  puts "That 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)

Ответ 6

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.

Ответ 7

Основываясь на ответе Дарммы, но включая краевые случаи

def prime? (n)
    if n <= 1
        false
    elsif n == 2
        true
    else 
        (2..n/2).none? { |i| n % i == 0}
    end
end

Ответ 8

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

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

Range can't be coerced into Fixnum (TypeError)

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

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

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

def prime?(n)
  (2..n/2).none?{|i| n % i == 0} 
end

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

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

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

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

Ответ 9

Это немного не соответствует теме в соответствии с деталями, но верно для названия: с помощью интеграции bash в рубине вы можете сделать:

def is_prime n
    `factor #{n}`.split.count < 3
end
Функция

bash factor возвращает число плюс все его факторы, поэтому, если число является простым, будет подсчитано два слова.

Это полезно только для кода для гольфа.

Ответ 10

Я пробовал это, и он работал:

def prime?(n)
  return false if n < 2 
  return true if n == 3 || n == 2 
    if (2...n-1).any?{|i| n % i == 0}
      false
    else
      true
    end
end

Ответ 11

def prime?(n)
  if n <= 1
  return false

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

   end
  end
end

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

Ответ 12

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

р простое (30) дает

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

Ответ 13

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

(1..100).select { |it| primt?(it) }

Ответ 14

** ДЛЯ ПРОСТОГО КОРОТКОГО МЕТОДА ** ПЕРВЫЙ УСТАНОВИТЬ ПРЕМЬЕР- ДРАГОЦЕННЫЙ КАМЕНЬ

require 'prime'
'p prime.first(20)'

Теперь сохраните этот файл под желаемым именем, это автоматически сгенерирует первые 20 простых чисел !! :-)