Euler : Problem 28

Posted by TAKAIY On 2011年5月14日土曜日 0 コメント
四角形にならべた数の対角線の合計の問題

中心から出る4つの対角線の数列の差分をとってみると2階差分が全部8

1  3  13  31  57  91
2 10 18 26 34
8 8 8 8

だから、n番目の数はan^2+bn+c の形で表わせる。
2階差分が8だから a=1、nを0始まりにすると、 c=1 に決って、bだけ対角線ごとに異なって、
右下方向 -2
左下方向 0
左上方向 2
右上方向 4

結局、1周分の角の合計は 16n^2+4n+4

あとはnの値が出れば、任意のところの合計が計算できる。。
対応する辺の長さは1,3,5... と増えていくから L=2n-1になり、n=(L+1)/2

この通りに式にする。

;;
;; Problem 28 : 2011/5/13
;; "Elapsed time: 1.278934 msecs"

(defn prob28 [len]
(let [n (/ (+ len 1) 2)]
(+ 1
(reduce +
(map #(+ (* 16 (expt % 2)) (* 4 %) 4)
(range 1 n))))))
;;


始め、「1001までの数を並べた」たと勘違いしていたので、数列を作る関数を作っちゃったから載せておく。
使わないけど。

;;
(defn sq-corner
([] (cons 1 (sq-corner 1)))
([num]
(lazy-seq
(concat
(list
(+ (* 4 (expt num 2)) (* -2 num) 1)
(+ (* 4 (expt num 2)) 1)
(+ (* 4 (expt num 2)) (* 2 num) 1)
(+ (* 4 (expt num 2)) (* 4 num) 1))
(sq-corner (inc num))))))
;;

0 コメント:

コメントを投稿