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

Problem36 10進でも2進でも回文数になる数の総和

問題

585 = 10010010012 (2進) は10進でも2進でも回文数である.

100万未満で10進でも2進でも回文数になる数の総和を求めよ.

(注: 先頭に0を含めて回文にすることは許されない.)


ソース

using System;
using System.Linq;

class Program
{
    static bool IsKaibun(string pTarget)
    {
        var sb = new System.Text.StringBuilder();
        foreach (Char EachChar in pTarget.ToCharArray().Reverse())
            sb.Append(EachChar);

        return pTarget == sb.ToString();
    }

    static void Main()
    {
        var Query = Enumerable.Range(1, 999999)
                   .Where(X => X % 2 == 1) //偶数は、2進数で1桁目が0なので、チェック対象外
                   .Where(X => IsKaibun(X.ToString()))
                   .Where(X => IsKaibun(Convert.ToString(X, 2)));

        int Cnt = 0, SumVal = 0;
        foreach (int EachInt in Query)
            Console.WriteLine("{0,3}番目は{1,7}。合計は{2,7}", ++Cnt, EachInt, SumVal += EachInt);
    }
}


実行結果

  1番目は      1。合計は      1
  2番目は      3。合計は      4
  3番目は      5。合計は      9
  4番目は      7。合計は     16
  5番目は      9。合計は     25
  6番目は     33。合計は     58
  7番目は     99。合計は    157
  8番目は    313。合計は    470
  9番目は    585。合計は   1055
 10番目は    717。合計は   1772
 11番目は   7447。合計は   9219
 12番目は   9009。合計は  18228
 13番目は  15351。合計は  33579
 14番目は  32223。合計は  65802
 15番目は  39993。合計は 105795
 16番目は  53235。合計は 159030
 17番目は  53835。合計は 212865
 18番目は  73737。合計は 286602
 19番目は 585585。合計は 872187


解説

IsKaibunという匿名でないメソッドを用意して、Where拡張メソッドで使うと便利ですね。