列出非素数的因子

问题描述 投票:0回答:3

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

ruby math
3个回答
0
投票

家庭作业提示1) 您需要更改以下内容才能获得所有因素:

  • 一找到一个因素就不要停止 (无论如何,你的寻找者代码效率都不高......)
  • 打印您找到的每个因素

如果你还需要正确的指数,你还需要

  • 检查每个找到的因素是否仍然是除以它之后的因素, 这需要在循环中完成

家庭作业提示2) 为了获得特定的所需输出,在需要时明确打印装饰(例如“,”和换行符)。 首先打印语句只能打印一次,可以使用“已打印”标志并在循环中打印语句之前检查它。

(我认为这是一个家庭作业问题,因此故意不提供完整的解决方案,根据这里描述的妥协How do I ask and answer homework questions? 谢谢你不关心我的假设,或者我接受你的回答。如果不是关于家庭作业,我认为尽管我的错误,你还是得到了帮助和帮助的方式。)


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]]

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

© www.soinside.com 2019 - 2024. All rights reserved.