Project Euler Problem 28

問題28:渦巻状に自然数を並べた1001x1001数方陣の対角線上にある数の合計を求める。方陣の詳細はリンク先参照[=>問題文]

問題28の解答

;; Emacs Lisp
(require 'cl)

(defun problem028 (N)
  (do ((n 3.0 (+ n 2)) (result 1))
      ((> n N) result)
    (let ((d (1- n)) (x (* n n)))
      (incf result x)
      (incf result (decf x d))
      (incf result (decf x d))
      (incf result (decf x d)))))

(problem028 1001)

 これは簡単ですね。外周の一辺のマス目の数を n とすると右上隅は n の二乗。その他の隅は n-1 ずつ減じた数になる。これを合わせれば外周上の四隅の合計が求まり、外周を増やしながらそれらを加算していけば、最終的には対角線上の総計が求まります。