« Project Euler - Problem 43 : 0.09s (Ruby 1.9) | トップページ | Project Euler - Problem 45 »

2009年8月 2日 (日)

Project Euler - Problem 44 : 3.8s (Ruby 1.9)

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


五角数を順に求めていって、配列の先頭に収めていきます。

新しい五角数を求めたとき、その五角数と配列の中身を頭から順に調べていくという方法をとっています。

もし、配列の最後まで調べた結果、条件に合わなければ、この五角数も、配列の先頭に入れます。

これを繰り返していくと配列には大きい順に五角数が並びます。

そのため、最初に見つかった五角数のペアの差が最小なのは自明なので、それ以上調べる必要がありません。

class Integer # * 五角数を求める。 def pentagon return (3 * self * self - self) / 2 end # * 五角数であれば、何番目かを返す。 def pentagon? x = ((1 + 24 * self) ** 0.5 + 1) / 6.0 if x == x.to_i then return x.to_i else return false end end end penta_list = [1] 2.upto(1/0.0) do |k| p_k = k.pentagon penta_list.each do |p_j| if (p_k - p_j).pentagon? and (p_k + p_j).pentagon? puts p_k - p_j exit end end penta_list.unshift(p_k) end

« Project Euler - Problem 43 : 0.09s (Ruby 1.9) | トップページ | Project Euler - Problem 45 »

Project Euler」カテゴリの記事

Ruby」カテゴリの記事

コメント

コメントを書く

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

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

トラックバック

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

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

« Project Euler - Problem 43 : 0.09s (Ruby 1.9) | トップページ | Project Euler - Problem 45 »

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            
フォト

最近のトラックバック

無料ブログはココログ