我有一个代码来获取素数列表:
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方法重写代码(select,collect等等)? 类似的东西:
s = (3..n)
s.select { |x| x % 2 == 1}.select{ |x| ..... }
问题是我需要在select方法中迭代结果数组(注释'here')。
答案 0 :(得分:8)
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方法,为了提高效率,你可能想要读取素数查找方法。
答案 1 :(得分:1)
您也可以列出这样的素数。
Example Array: ar = (2..30).to_a
ar.select{ |n| (2..n).count{ |d| (n % d).zero? } == 1 }
答案 2 :(得分:0)
特点: 检查一个数字是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
注意:涉及三个功能,我故意为初学者做这个,这样他们就可以很容易地理解它了
优化指南:
1)如果要保存迭代,可以从2开始循环并以n-1结束
2)使用Ruby核心功能并享受:)