Отображение коэффициентов числа, предложенного пользователем

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

Мне удалось создать первую часть программы, но я борюсь с последней частью.

def prime(n)
 is_prime = true
  for i in 2..n-1
   if n % i == 0
   is_prime = false
end
 end

if is_prime
 puts "#{n} is a prime number"
else
 puts "#{n} is not a prime number =>" 

end
 end


prime(n)

На этом шаге:

puts "#{n} is not a prime number =>" 

Я хочу включить отображение факторов, скажем, число 8

8 не простое число => 1, 2, 4, 8

Любая помощь или совет будут очень признательны!


person Vroryn    schedule 03.03.2017    source источник


Ответы (1)


Попробуйте этот код:

def factors(n)
  (1..n/2).select{|e| (n%e).zero?}.push(n)
end

факторы(8) => [1,2,4,8]

и ваш последний шаг будет выглядеть так:

puts "#{n} is not a prime number =>#{factors(n).join(',')}" 

Кстати: для проверки, является ли число простым, советуем использовать решето Эратосфена.

person Dmitry Cat    schedule 03.03.2017
comment
Вы можете ускорить свой код нахождения факторов на 100%. Вам нужно проверить только первую половину (c / 2) чисел. Вторая половина никогда не даст множителя (кроме самого c) - person Sergio Tulentsev; 03.03.2017
comment
Также используйте select вместо map + compact. Будет выглядеть намного чище. - person Sergio Tulentsev; 03.03.2017
comment
Привет, это сработало, спасибо! Но не могли бы вы объяснить, что такое select, join и .zero? делать? Я относительно новичок в рубине :/ - person Vroryn; 03.03.2017
comment
Эй, нет проблем: 1. (1..n/2) генерирует класс Range от 1 до n/2 2. select выбирает из элементов Range, где n%e == 0 ноль? метод возвращает true, если число == 0; метод select возвращает массив 3. push(n) добавляет к элементу массива(n) - person Dmitry Cat; 03.03.2017