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 простых чисел !! :-)