総当たりでいいんじゃない?
しばらく考えていたが、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; } } }