C#でプロジェクトオイラーを解く(問題28「螺旋状に並んだ数の対角線」)

プロジェクトオイラー
Pocket

どーも、みつおです。

問題

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の螺旋を同じ方法で生成したとき, 対角線上の数字の和はいくつか?

出典:Problem28

解答

using System;

namespace Problem28
{
    class Program
    {
        static void Main(string[] args)
        {
            Console.WriteLine(Solve());
            Console.ReadLine();
        }

        private static long Solve()
        {
            long ret = 0;
            int p = 1;
            long no = 1001 * 1001;
            int tmp = 1;

            for (long i = 1; i <= no; i++)
            {
                //枠の移動量
                if (p * p <= i)
                {
                    //3,5,7...
                    p = p + 2;
                }

                //対角線上か判定
                if (tmp == i)
                {
                    ret += tmp;
                    tmp = tmp + p - 1;
                }
            }

            return ret;
        }
    }
}

 

出力

669171001

コメント

タイトルとURLをコピーしました