トップページに戻る    次のC#のサンプルへ    前のC#のサンプルへ

Problem55 Lychrel数

問題

47とその反転を足し合わせると, 47 + 74 = 121となり, 回文数になる.

全ての数が素早く回文数になるわけではない. 349を考えよう,
1.  349  + 943 = 1292
2. 1292 + 2921 = 4213
3. 4213 + 3124 = 7337

349は, 3回の操作を経て回文数になる.

まだ証明はされていないが, 196のようないくつかの数字は回文数にならないと考えられている.
反転したものを足すという操作を経ても回文数にならないものをLychrel数と呼ぶ.
先のような数の理論的な性質により, またこの問題の目的のために,
Lychrel数で無いと証明されていない数はLychrel数だと仮定する.

更に, 10000未満の数については,常に以下のどちらか一方が成り立つと仮定してよい.

1. 50回未満の操作で回文数になる
2. まだ誰も回文数まで到達していない

実際, 10677が50回以上の操作を必要とする最初の数である
4668731596684224866951378664 (53回の操作で28桁のこの回文数になる).

驚くべきことに, 回文数かつLychrel数であるものが存在する. 最初の数は4994である.

10000未満のLychrel数の個数を答えよ.


ソース

using System;
using System.Linq;

class Program
{
    static void Main()
    {
        int LychrelCnt = 0;
        for (int I = 1; I <= 9999; I++) {
            decimal CurrVal = I;
            bool IsKaibun = false;

            for (int J = 1; J <= 49; J++) {
                string wkStrAsc = CurrVal.ToString();
                string wkStrDesc = new string(wkStrAsc.Reverse().ToArray());
                CurrVal += decimal.Parse(wkStrDesc);

                char[] wkCharArr = CurrVal.ToString().ToCharArray();
                IsKaibun = wkCharArr.SequenceEqual(wkCharArr.Reverse());

                if (IsKaibun) break;
            }
            if (IsKaibun == false) {
                Console.WriteLine("{0}はLychrel数", I);
                LychrelCnt++;
            }
        }
        Console.WriteLine("10000未満のLychrel数は{0}個", LychrelCnt);
    }
}


実行結果

省略
9898はLychrel数
9957はLychrel数
9974はLychrel数
9978はLychrel数
9988はLychrel数
9999はLychrel数
10000未満のLychrel数は249個


解説

オーバフロー防止のために、decimal型を使ってます。

MSDN --- decimal型