2016-02-15 83 views
-2

我知道类似的问题之前已经被问到过,但它们都显得如此复杂,我不认为我那么遥远,所以想知道是否有人知道如何调整我的代码以使它达到工作。我的目标是将一个范围的所有素数保存到一个数组中,然后打印该数组。下面是我到目前为止的代码红宝石素数程序

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] 

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

+0

来吧,你可以自己做。 – Meier

+0

你允许使用'Class#Prime'库吗? –

+0

哈哈@meier我试过我答应!我只是不能解决如何隔离素数! – RuNpiXelruN

回答

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] 

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

+0

谢谢你这么多。这样一个很好的答案。非常感激! – RuNpiXelruN