« Project Euler - Problem 37 : 0.09s (Ruby 1.9) | トップページ | Project Euler - Problem 39, 40 »

2009年7月23日 (木)

Project Euler - Problem 38 : 0.1s (Ruby 1.9)

問題はこちらをご覧ください。


この記事の中では、連結積を m * (1, 2, ..., n) という形で表すことにします。

すると、n > 1 なので、m は 1 〜 4 桁の数になります。

それぞれの桁の中で連結積の最大値を求める場合、m x 1 すなわち m が大きいほど良いことが分かります。

そこで、m を 1 〜 4 桁の場合に分けて、それぞれ m が大きい方から連結積を求めてみました。

最近私の頭の中では、Panditital 数といえば順列 (permutation) が条件反射的に出てくるようになっています。そこで今回も、連結積を求めるメソッドでは permutation を使っています。

また、二つの式を "and" でつないで、一つの "while 修飾子" で制御しています。

# -*- coding: utf-8 -*- require 'math_tool' # * d : 連結積を m * (1, 2, ..., n) の形で表した場合の m の桁数 # * m が大きい順に連結積を求めていき、連結積が見つかった場合は # その数を、見つからなかった場合には 0 を返す。 def find_max(d) (1 .. 9).to_a.reverse.permutation(d).each do |arr| m = arr.to_i i = 2 arr = arr + (m * i).to_a and i = i + 1 while arr.size < 9 return arr.to_i if arr.pandigital? end return 0 end ans = Array.new (1 .. 4).each{|d| ans.push(find_max(d))} puts ans.max

« Project Euler - Problem 37 : 0.09s (Ruby 1.9) | トップページ | Project Euler - Problem 39, 40 »

Project Euler」カテゴリの記事

Ruby」カテゴリの記事

コメント

コメントを書く

コメントは記事投稿者が公開するまで表示されません。

(ウェブ上には掲載しません)

トラックバック

この記事のトラックバックURL:
http://app.cocolog-nifty.com/t/trackback/112020/45717370

この記事へのトラックバック一覧です: Project Euler - Problem 38 : 0.1s (Ruby 1.9):

« Project Euler - Problem 37 : 0.09s (Ruby 1.9) | トップページ | Project Euler - Problem 39, 40 »

2016年7月
          1 2
3 4 5 6 7 8 9
10 11 12 13 14 15 16
17 18 19 20 21 22 23
24 25 26 27 28 29 30
31            
フォト

最近のトラックバック

無料ブログはココログ