Ruby Prime号码程序

时间:2016-02-15 23:01:13

标签: ruby math

我知道以前曾经问过类似的问题,但它们看起来都太复杂了,我不认为我那么遥远,所以想知道是否有人知道如何调整我的代码来实现它工作。我的目标是将一个范围的所有素数保存到一个数组中,然后打印该数组。以下是我目前的代码

prime_array = []

(1...100).each do |num|
  if Math.sqrt(num) % 2 == 0
    prime_array.push(num)
  end
end

prime_array
#=> [4, 16, 36, 64]

我已经尝试了一些不同的选择,但已经碰壁,无法看到我需要做什么。我试图让它尽可能简单,因为我觉得很多答案都有点过于复杂。提前谢谢。

2 个答案:

答案 0 :(得分:1)

让我们计算7(素数)和8(复合数)的平方根:

Math.sqrt(7) #=> 2.6457513110645907
Math.sqrt(8) #=> 2.8284271247461903

这不是真的有帮助,是吗?显然,您无法通过计算其平方根来确定数字是否为素数。

相反,你必须检查数字的除数。来自Wikipedia

  

素数(或素数)是natural number大于1且除了1以外没有正divisors本身。

让我们确定7的除数:(使用模运算符%

7 % 1 #=> 0 <- 7 is divisible by 1
7 % 2 #=> 1
7 % 3 #=> 1
7 % 4 #=> 3
7 % 5 #=> 2
7 % 6 #=> 1
7 % 7 #=> 0 <- 7 is divisible by 7

这满足上述定义 - 7是素数。

现在,让我们确定8的除数:

8 % 1 #=> 0 <- 8 is divisible by 1
8 % 2 #=> 0 <- 8 is divisible by 2
8 % 3 #=> 2
8 % 4 #=> 0 <- 8 is divisible by 4
8 % 5 #=> 3
8 % 6 #=> 2
8 % 7 #=> 1
8 % 8 #=> 0 <- 8 is divisible by 8

8有两个附加除数2和4.因此,8 是素数。

在Ruby中,您可以使用select来查找除数:

(1..7).select { |d| 7 % d == 0 } #=> [1, 7]
(1..8).select { |d| 8 % d == 0 } #=> [1, 2, 4, 8]

最后,这是一个Ruby代码的变体,用于检查给定数字num是否只有两个除数1num本身:

prime_array = []

(1...100).each do |num|
  if (1..num).select { |d| num % d == 0 } == [1, num]
    prime_array.push(num)
  end
end

prime_array
#=> [2, 3, 5, 7, 11, 13, 17, 19, 23, 29, 31, 37, 41, 43, 47, 53, 59, 61, 67, 71, 73, 79, 83, 89, 97]

可以优化上述代码。我把它留给你。

答案 1 :(得分:0)

在ruby数组中返回素数的方法

 def is_prime?(number)
       return false if number <2
        (2..Integer.sqrt(number)).each do |divisor|
              return false if number % divisor == 0
  end
     return number
end

def read_array(array)
     primes = []
  array.each do |num|
       primes << num if is_prime?(num)
  end
 return primes
end