2012年5月27日日曜日

Project Euler-Problem10をgroovyで解いてみる

問題

10以下の素数の和は2 + 3 + 5 + 7 = 17である.
200万以下の全ての素数の和を計算しなさい.

問題を解いたプログラム

処理時間はものすごくかかります。(3分弱かな)
import common.Prime

def prime = new Prime()
def sum = prime.primes(2000000).sum()
println "sum = ${sum}"

Primeクラスはのprimesはiteratorを返すようにしてます。
package common

class Prime {

  def primes(int max) {
    return new Iterator<Long>() {

      def primes = []

      boolean hasNext() {
        def start = primes ? primes.max() + 1 : 2
        def result = (start..max).findResult {
          if (isPriem(it)) {
            it
          }
        }
        if (result) {
          primes << result
          primes.last() < max
        } else {
          false
        }
      }

      Long next() {
        primes.last()
      }

      void remove() {
        throw new UnsupportedOperationException()
      }

      private def isPriem(int num) {
        if (num == 2) {
          true
        } else if (num % 2 == 0) {
          false
        } else {
          def sqrt = Math.sqrt(num).toInteger()
          primes.findResult(true) {
            if (it > sqrt) {
              true
            } else if (num % it == 0) {
              false
            }
          }
        }
      }
    };
  }
}