「プロジェクトオイラー問28」の編集履歴(バックアップ)一覧に戻る

プロジェクトオイラー問28 - (2014/02/14 (金) 08:06:27) のソース

http://odz.sakura.ne.jp/projecteuler/index.php?cmd=read&page=Problem%2028
*Problem 28 「螺旋状に並んだ数の対角線」 †


1から初めて右方向に進み時計回りに数字を増やしていき, 5×5の螺旋が以下のように生成される:

 21	22	23	24	25
 20	7	8	9	10
 19	6	1	2	11
 18	5	4	3	12
 17	16	15	14	13
両対角線上の数字の合計は101であることが確かめられる.

1001×1001の螺旋を同じ方法で生成したとき, 対角線上の数字の和はいくつか?



解法
4つ角単位で計算します。
最初の1はスペシャルケース。
そのあとは右下角を基準に、左下角=右下+枠のサイズ-1、左上角=右下+(枠のサイズ-1)*2 右上角=右下+(枠のサイズ-1)*3
となります。
右下角のさらに斜め右下は(枠サイズ-1)*3+(枠サイズ+1)で逐次的に計算できます。


 calc(1003,_,Sum,Sum):-!.
 calc(Size,Num,Sum,Result):-
  	Sum1 is Sum+Num*4+(Size-1)*6,
 	NextNum is Num+(Size-1)*3+(Size+1),
 	Size1 is Size+2,
 	calc(Size1,NextNum,Sum1,Result).
 main28:-
 	calc(3,3,1,Ans),
 	write(Ans).