我的目标是显示一个数字是否为素数,如果不是,则列出所有因子。如果我输入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
公式。任何帮助将不胜感激。
答案 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