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

プロジェクトオイラー
Pocket

どーも、みつおです。

数学の問題以外で日常で5乗することなどあるのだろうか。

問題

驚くべきことに, 各桁を4乗した数の和が元の数と一致する数は3つしかない.

  • 1634 = 1^4 + 6^4 + 3^4 + 4^4
  • 8208 = 8^4 + 2^4 + 0^4 + 8^4
  • 9474 = 9^4 + 4^4 + 7^4 + 4^4

ただし, 1=1^4は含まないものとする. この数たちの和は 1634 + 8208 + 9474 = 19316 である.

各桁を5乗した数の和が元の数と一致するような数の総和を求めよ.

出典:Problem30

解答

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

namespace Problem30
{
    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>();

            //各桁の5乗の最大値 = 354294 = 9^5 * 6
            for (long i = 2; i < 354294; i++)
            {
                Stack<long> st = new Stack<long>();

                //元の数
                long n = i;

                //各桁の値を取得
                while (n > 0)
                {
                    st.Push(n % 10);
                    n /= 10;
                }

                //各桁を5乗した和が元の値と一致するか判定
                if (i == SumStack(st)) tmp.Add(i);
            }

            //各桁を5乗した数の和が元の数と一致するような数の総和
            ret = tmp.Sum();

            return ret;
        }

        private static long SumStack(Stack<long> st)
        {
            long ret = 0;

            //各桁分ループ
            foreach (var t in st)
            {
                //5乗した値を足しこむ
                ret += (long)Math.Pow(t, 5);
            }

            return ret;
        }
    }
}

 

出力

443839

コメント

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