Project Euler : Problem 55 『Lychrel numbers』

キリンねるねんりき (回文まんが絵本)

総当たりでいいんじゃない?

 しばらく考えていたが、10000以下を調べる程度なら総当たりで十分だと思った。

コード

using System;
using System.Linq;
using System.Numerics;

namespace test
{
    class Program
    {
        //最大計算回数
        static readonly int CalcMaxCount = 50;

        static readonly int StartNumber = 1;
        static readonly int CountNumber = 10000;

        static void Main(string[] args)
        {
            var count = CountLychrelNumbers();
            Console.WriteLine($"Count {count}");
        }

        /// <summary>
        /// リクレル数をカウント
        /// </summary>
        static int CountLychrelNumbers()
        {
            var count = 0;

            foreach (var num in Enumerable.Range(StartNumber, CountNumber))
            {
                if (IsLychrelNumber((BigInteger)num)) count++;
            }

            return count;
        }

        /// <summary>
        /// リクレル数か判定する
        /// </summary>
        static bool IsLychrelNumber(BigInteger n)
        {
            foreach (var i in Enumerable.Range(1, CalcMaxCount))
            {
                var rn = ReverseNumber(n);
                var sum = n + rn;

                if (IsPalindromicNumber(sum)) return false;
                else n = sum;
            }

            return true;
        }

        /// <summary>
        /// 回文数か判定する
        /// </summary>
        static bool IsPalindromicNumber(BigInteger n)
        {
            var s = n.ToString();
            var l = s.Length / 2;

            foreach (var i in Enumerable.Range(0, l))
            {
                if (s[i] != s[s.Length - 1 - i]) return false;
            }

            return true;
        }

        /// <summary>
        /// 数値を反転させる
        /// </summary>
        static BigInteger ReverseNumber(BigInteger n)
        {
            var rs = ReverseString(n.ToString());

            return BigInteger.Parse(rs);
        }

        /// <summary>
        /// 文字列を反転させる
        /// </summary>
        static string ReverseString(string s)
        {
            var rs = string.Empty;

            foreach (var i in Enumerable.Range(0, s.Length).Reverse())
                rs += s[i];

            return rs;
        }
    }
}