C#でプロジェクトオイラーを解く(問題34「桁の階乗」)

プロジェクトオイラー
Pocket

どーも、みつおです。

階乗の記号って!(ビックリマーク)なんだけど、びっくりするほど大きな数字になるかららしい。

ほんとビックリするほど大きな数字になるよね。10!で3628800だもん。

問題

145は面白い数である. 1! + 4! + 5! = 1 + 24 + 120 = 145となる.

各桁の数の階乗の和が自分自身と一致するような数の和を求めよ.

注: 1! = 1 と 2! = 2 は総和に含めてはならない.

出典:Problem34

解答

using System;

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

        private static long Solve()
        {
            long ret = 0;

            //各桁の数の階乗の和の最大値 = 2177280 = 9! * 7
            for (int i = 3; i <= 2540160; i++)
            {
                //各桁の数の階乗の和が自分自身と一致するか判定
                if (i == SumFact(i)) ret += i;
            }

            return ret;
        }

        static long SumFact(int i)
        {
            long ret = 0;
            int n = i;

            //全ての桁についてループ
            while (n > 0)
            {
                //階乗を足しこむ
                ret += Factorial(n % 10);
                n /= 10;
            }

            return ret;
        }

        static long Factorial(int n)
        {
            if (n == 0)
                return 1L;
            return n * Factorial(n - 1);
        }
    }
}

 

出力

40730

コメント

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