「プロジェクトオイラー問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).