Project Euler 028を解いてみる。「螺旋状に並んだ数の対角線」


Project Euler 028

028

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

両対角線上の数字の合計は101であることが確かめられる.
1001×1001の螺旋を同じ方法で生成したとき, 対角線上の数字の和はいくつか?

->次の問題

考え方

当直で呼ばれ、時間も元気もなくなったので定番のゴリ押しで行きます(^q^)
最も内側の四角形は3,5,7,9と2ずつ増え、その1つ外側では13,17,21,25と4ずつ増えます。外周が1つ外側に行くと辺の長さは2ずつ増えるので、それぞれの角の差も2ずつ増えていきます。
これをコードにして1001まで回します。

コード

euler028.py
def main():
    num = 1  # 対角線上の数
    answer = 1  # 答え用の変数
    for i in range(2, 1001, 2):  # iは2ずつ増える
        for _ in range(4):
            num += i  # 対角線の数を計算し、
            answer += num  # 合計に足す
    print(answer)


if __name__ == '__main__':
    from time import time as t
    st = t()
    main()
    print(t() - st, 'sec')

paizaにて実行
結果
669171001
0.0002090930938720703 sec