如何在Ruby中测试值是否为素数? 简单和困难的方式?

我正在尝试创建一个程序来测试一个值是否为素数,但我不知道如何。 这是我的代码:

class DetermineIfPrime def initialize (nth_value) @nth_value = nth_value primetest end def primetest if Prime.prime?(@nth_value) puts ("#{@nth_value} is prime") else puts ("This is not a prime number.") end rescue Exception puts ("#{$!.class}") puts ("#{$!}") end end 

每次我跑,它都会返回。

 NameError uninitialized constant DetermineIfPrime::Prime 

我尝试了其他方法来完成这项工作,但我认为这是我能得到的最接近的方法。

我也试过这个:

 class DetermineIfPrime def initialize (nth_value) @nth_value = nth_value primetest end def primetest for test_value in [2, 3, 5, 7, 9, 11, 13] do if (@nth_value % test_value) == 0 puts ("#{@nth_value} is not divisible by #{test_value}") else puts ("This is not a prime number since this is divisible by #{test_value}") break end end end end 

或者我只是做错了什么?

Ruby内置了一种方法来检查数字是否为素数。

 require 'prime' Prime.prime?(2) #=> true Prime.prime?(4) #=> false 
 def is_prime?(num) return false if num <= 1 Math.sqrt(num).to_i.downto(2).each {|i| return false if num % i == 0} true end 

首先,我们检查0和1,因为它们不是素数。 然后我们基本上只检查少于num每个数字,看它是否分开。 但是,正如这里所解释的,对于大于num平方根的每个因子,都有一个更小的因子,所以我们只看2和平方根。

更新

def is_prime?(num) return if num <= 1 (2..Math.sqrt(num)).none? { |i| (num % i).zero? } end

您得到的错误是因为您的代码中没有要求Prime ,您需要在文件中require Prime

我在这里找到一个很酷的方法,检查数字是否为素数如下:

 class Fixnum def prime? ('1' * self) !~ /^1?$|^(11+?)\1+$/ end end 10.prime? 
 def is_prime?(num) Math.sqrt(num).floor.downto(2).each {|i| return false if num % i == 0} true end 

大声笑抱歉复活一个超级老问题,但它是第一个出现在谷歌。

基本上,它循环遍历可能的除数,使用平方根作为最大数来检查以节省非常大的数字的时间。

从算法的角度来看,检查数字是否为素数可以通过检查所有数字直到并包括(向下舍入到前一个整数)所述数字的平方根来完成。

例如,检查100是否为素数包括检查最多10个。检查99表示仅转到9。

**另一种思考方式**
每个因子都有一对(3是因子36,3对是12)。
该对位于平方根的另一侧(6的平方根为36,3 <6,12> 6)。
因此,通过检查所有内容直到平方根(并且不会超过)确保您检查所有可能的因素。

您可以通过使用要进行比较的素数列表来更快地进行比较。 如果你有一个相当小的最大限制,你可以只有一个素数列表并直接查找以查看该数字是否为素数。

如果要使用任何Prime函数,则必须包含Prime库。 然而,可以在不使用主库的情况下解决该问题。

 def isPrime?(num) (2..Math.sqrt(num)).each { |i| if num % i == 0 && i < num return false end } true end 

像这样的东西会起作用。

在回答你的问题时,虽然你可以通过使用Ruby的Prime解决问题,但我将编写代码来自己回答它。

请考虑您需要做的就是确定一个小于整数平方根的因子。 任何大于整数平方根的数字都需要第二个因子来将数字作为产品。 (例如,15的平方根约为3.8,所以如果你发现5作为一个因子,它只是因子对3和5的一个因素!!)

  def isPrime?(num) (2..Math.sqrt(num)).each { |i| return false if num % i == 0} true end 

希望有所帮助!!

试试这个

 def prime?(num) 2.upto(Math.sqrt(num).ceil) do |i| break if num%i==0 return true if i==Math.sqrt(num).ceil end return false end 

所以这里的大部分答案都是以略微不同的方式做同样的事情,这是关于Ruby的一个很酷的事情,但我是一个非常新的学生(这就是为什么我在第一时间看这个)所以这里是我的版本在代码中有注释说明:

 def isprime n # starting with 2 because testing for a prime means you don't want to test division by 1 2.upto(Math.sqrt(n)) do |x| # testing up to the square root of the number because going past there is excessive if n % x == 0 # n is the number being called from the program # x is the number we're dividing by, counting from 2 up to the square root of the number return false # this means the number is not prime else return true # this means the number is prime end end end