« Scheme でクイックソート | トップページ | Project Euler - Problem 35 »

2009年5月 6日 (水)

Project Euler - Problem 45

Problem 45 です。

この問題は、ちょっといやらしいです。

n = 2 * m - 1 の時、Tn = Hm になるので、六角数は完全に三角数に含まれてしまいます。つまり、六角数であれば、必ず三角数になるのです。

ということで、この問題を解くのに三角数の判定は必要ありません。


実際のコードは 144 番目以降の六角数を探していって、五角数かどうかを判定しています。

(define pentagon-number? (lambda (n) (let* ([a (sqrt (+ 1 (* 24 n)))] [b (/ (+ 1 a) 6)]) (if [positive-integer? b] b #f)))) (define hexagon-number (lambda (n) (- (* 2 n n) n))) (define problem-045 (lambda (n) (do ([i n (+ i 1)]) ([pentagon-number? (hexagon-number i)] (printf "~d~%" (hexagon-number i)))))) (problem-045 144)

ruby で書くとこんな感じでしょうか?

class Integer # = 五角数であれば、何番目かを返す。 def pentagon? x = (1 + Math.sqrt(1 + 24 * self)) / 6 if (x == x.to_i) then return x.to_i else return false end end # = 六角数を求める。 def hexagon return (2 * self * self - self) end end 144.upto(1.0/0.0) do |i| h = i.hexagon if (h.pentagon?) then puts h break end end

« Scheme でクイックソート | トップページ | Project Euler - Problem 35 »

Project Euler」カテゴリの記事

Scheme」カテゴリの記事

コメント

コメントを書く

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

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

トラックバック

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

この記事へのトラックバック一覧です: Project Euler - Problem 45:

« Scheme でクイックソート | トップページ | Project Euler - Problem 35 »

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

最近のトラックバック

無料ブログはココログ