使用Array方法的素数列表

我有一个代码来获取素数列表:

def primes_numbers num primes = [2] 3.step(Math.sqrt(num) + 1, 2) do |i| is_prime = true primes.each do |p| # (here) if (p > Math.sqrt(i) + 1) break end if (i % p == 0) is_prime = false break end end if is_prime primes << i end end primes end 

是否可以使用Array方法重写代码(选择,收集等等)? 就像是:

 s = (3..n) s.select { |x| x % 2 == 1}.select{ |x| ..... } 

问题是我需要在select方法中迭代结果数组(注释’here’)。

Ruby 1.9有一个非常好的Prime类:

http://www.ruby-doc.org/core-1.9/classes/Prime.html

但我假设你不关心任何标准类,但想看一些代码,所以我们在这里:

 >> n = 100 #=> 100 >> s = (2..n) #=> 2..100 >> s.select { |num| (2..Math.sqrt(num)).none? { |d| (num % d).zero? }} #=> [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] 

注意:我这样编写它是因为你想要Enumerable方法,为了提高效率,你可能想要读取素数查找方法。

您也可以列出这样的素数。

 Example Array: ar = (2..30).to_a ar.select{ |n| (2..n).count{ |d| (n % d).zero? } == 1 } 

function:检查一个数字是Prime,得到一个数字因子并得到素数列表,你也可以用你想要的任何语言轻松转换它

由于Ruby有自己的Prime类,所以你不必担心

但如果你想自己做,而不使用ruby核心的东西

 n=100 #=> a def prime_numbers(n) prime_numbers = [] (1..n).each do |number| prime_numbers << number if is_prime(number) end prime_numbers end def is_prime(n) if factors(n).count > 2 return true end return false end 

#找到一个数字的因子

 def factors(n) factors = [] (1..n).each {|d| factors << d if (n%d).zero?} factors end 

注意:涉及三个function,我故意为初学者做这个,这样他们就可以很容易地理解它

优化指南:

1)如果要保存迭代,可以从2开始循环并在n-1结束

2)使用Ruby核心function并享受:)