C#でプロジェクトオイラーを解く(問題36「二種類の基数による回文数」)

プロジェクトオイラー
Pocket

どーも、みつおです。

問題

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

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

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

出典:Problem36

解答

using System;
using System.Collections.Generic;
using System.Linq;

namespace Problem36
{
    class Program
    {
        static void Main(string[] args)
        {
            Console.WriteLine(Solve());
            Console.ReadLine();
        }

        private static long Solve()
        {
            long ret = 0;
            List<long> tmp = new List<long>();

            for (int i = 1; i < 1000000; i++)
            {
                //10進数が回文かチェック
                if (IsKaibun(i))
                {
                    //2進数が回文かチェック
                    if (IsKaibunNisinsu(i))
                    {
                        tmp.Add(i);
                    }
                }
            }

            //総和
            ret = tmp.Sum();

            return ret;
        }

        private static bool IsKaibun(int no)
        {
            string s = no.ToString();

            //回文か判定
            return s.Reverse().SequenceEqual(s);
        }

        private static bool IsKaibunNisinsu(int no)
        {
            //2進数に変換
            string s = Convert.ToString(no, 2);

            //回文か判定
            return s.Reverse().SequenceEqual(s);
        }
    }
}

 

出力

872187

 

コメント

タイトルとURLをコピーしました