使用Array方法的素数列表

时间:2011-04-08 08:22:54

标签: ruby

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

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')。

3 个答案:

答案 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核心功能并享受:)