四角形にならべた数の対角線の合計の問題
中心から出る4つの対角線の数列の差分をとってみると2階差分が全部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
この通りに式にする。
始め、「1001までの数を並べた」たと勘違いしていたので、数列を作る関数を作っちゃったから載せておく。
使わないけど。
中心から出る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 コメント:
コメントを投稿