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

Problem145 10億未満に存在するreversibleな数

問題

ある正の整数nについて, [n + reverse(n)]の結果の各桁の数字が奇数のみで表されるようなnが存在する.
例えば, 36 + 63 = 99, 409 + 904 = 1313 のように. この性質を持つ数を, reversibleと呼ぶことにする.
つまり, 36, 63, 409, 904はrevesibleである.
先頭の0はnでもreverse(n)でも許されない.

1000未満には120個のreversibleな数が存在する.
10億未満では, いくつのreversibleな数が存在するか.


ソース

using System;

class Program
{
    static void Main()
    {
        var sw = System.Diagnostics.Stopwatch.StartNew();

        int AnsCnt = 0;
        //for (int I = 1; I < 1000; I++) {
        for (int I = 1; I < 1000000000; I++) {
            if (I % 100000000 == 0)
                Console.WriteLine("{0}をチェック中。経過時間={1}", I, sw.Elapsed);

            if (I % 10 == 0) continue; //先頭の0は許されない
            int wk1 = I;
            int wk2 = GetRevNum(wk1);
            int wk3 = wk1 + wk2;
            if (IsKisuuOnly(wk3)) AnsCnt++;
        }
        Console.WriteLine("reversibleな数は{0}個", AnsCnt);
    }

    static int GetRevNum(int pTarget)
    {
        int WillReturn = 0;
        do {
            WillReturn *= 10;
            WillReturn += pTarget % 10;
            pTarget /= 10;
        } while (pTarget > 0);
        return WillReturn;
    }

    static bool IsKisuuOnly(int pTarget)
    {
        do {
            if ((pTarget % 10) % 2 == 0) return false;
            pTarget /= 10;
        } while (pTarget > 0);
        return true;
    }
}


実行結果

100000000をチェック中。経過時間=00:00:09.9183234
200000000をチェック中。経過時間=00:00:21.0184864
300000000をチェック中。経過時間=00:00:32.2801124
400000000をチェック中。経過時間=00:00:43.1665714
500000000をチェック中。経過時間=00:00:54.4731517
600000000をチェック中。経過時間=00:01:05.6592723
700000000をチェック中。経過時間=00:01:17.1603418
800000000をチェック中。経過時間=00:01:28.3421764
900000000をチェック中。経過時間=00:01:39.8375874
reversibleな数は608720個


解説

10億回と処理回数が多いので、処理速度を重視して、

数字の順序を入れ替えた数を求めるメソッドと、
数値の各桁が奇数か判定するメソッドで、
Int型から、String型およびChar型配列への変換しないようにしてます。