列出非素数的因子

时间:2018-03-03 04:34:15

标签: ruby math

我的目标是显示一个数字是否为素数,如果不是,则列出所有因子。如果我输入6,程序应返回:

6 is not a prime number => 2, 3

这是我到目前为止所做的:

puts "Enter a number: "
  num = gets
  num = num.to_i

def prime(num)
  is_prime = true
  for i in 2..num-1
    if num % i == 0
      is_prime = false
    end
  end
  if is_prime
    puts "#{num} is prime!"
  else
    puts "#{num} is not prime!"
  end
end
prime(num)  

我尝试为此制作while循环,但我似乎无法使其正常工作。我不确定我是否正确使用num%i==0公式。任何帮助将不胜感激。

2 个答案:

答案 0 :(得分:1)

如果允许,请使用标准库类Prime

require 'prime'

def is_prime? n
  n.prime? ? n : Prime.prime_division(n)
end

p is_prime? 6   #=> [[2, 1], [3, 1]]
p is_prime? 11  #=> 11
p is_prime? 100 #=> [[2, 2], [5, 2]]

答案 1 :(得分:0)

require 'prime'

def factors(n)
  first, *rest =
    Prime.prime_division(n).map { |n,power| [n].product((0..power).to_a) }
   first.product(*rest).map { |a| a.reduce(1) { |t,(n,power)| t * n**power } }       
end

让我们用这个方法来计算1500的因子。

factors 1500
  #=> [ 1,  5,  25,  125,
  #     3, 15,  75,  375,
  #     2, 10,  50,  250,
  #     6, 30, 150,  750,
  #     4, 20, 100,  500,
  #    12, 60, 300, 1500]

请注意

Prime.prime_division(1500)
  #=> [[2, 2], [3, 1], [5, 3]]

Prime.prime_division(500).map { |n,power| [n].product((0..power).to_a) }
  #=> [[[2, 0], [2, 1], [2, 2]], [[5, 0], [5, 1], [5, 2], [5, 3]]]

此外,当且仅当factors(n).size为素数时,2等于n。例如,

factors(37)
  #=> [1, 37]
Prime.prime?(37)
  #=> true

请参阅Prime::prime_division