Проверка, будет ли возвращено целое число - PullRequest
0 голосов
/ 22 января 2020

В рамках тренировочного упражнения Ruby я пытаюсь выяснить, сколько делителей имеет число «n». Я планирую написать что-то вроде:

x = 1,  
while n > x do ___,  
n/x,   
if n/x = integer, 
puts x,   
x = x+1.

Очевидно, что это не сработает. Я предполагаю, что я спрашиваю, как правильно написать "если n / x является целым числом, ставит x."

Спасибо за любую помощь.

Ответы [ 2 ]

1 голос
/ 22 января 2020

Вы можете взглянуть на стандартную библиотеку Ruby Prime, которая определяет метод Prime # prime_division .

Таким образом, учитывая число n = 3780, вы можете получить его простые множители и показатели степени:

require 'prime'

n = 2**2 * 3**3 * 5 * 7 #=> 3780
Prime.prime_division(n) #=> [[2, 2], [3, 3], [5, 1], [7, 1]]

Затем можно сопоставить показатель степени, добавить по одному для каждого из сопоставленных элементов и умножить элементы друг на друга, чтобы получить число делителей, включая 1 и n Сам:

Prime.prime_division(n).map{|n| n.last + 1}.inject(:*)
#=> 48

Здесь вы можете найти, как это работает: https://www.math.upenn.edu/~deturck/m170/wk2/numdivisors.html

1 голос
/ 22 января 2020

как правильно написать "если n / x является целым числом, ставит x."

Обычно вы используете операцию по модулю ( % в Ruby) и проверьте, вернется ли он 0:

6 % 1 #=> 0
6 % 2 #=> 0
6 % 3 #=> 0
6 % 4 #=> 2
6 % 5 #=> 1

Ваш псевдокод преобразуется в Ruby:

n = 6
x = 1
while n > x
  if n % x == 0
    puts x
  end
  x = x + 1
end

или более идиоматических c и немного оптимизировано: (только до n/2)

n = 6
1.upto(n/2).select { |i| n % i == 0 }
#=> [1, 2, 3]

Обратите внимание, что это возвращает массив. Поставьте puts перед ним, чтобы напечатать его элементы.

...