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

Problem125 回文数となる平方数の和

問題

回文数 595 は連続する平方数の和で表すことができるという面白い性質を持つ:
6*6 + 7*7 + 8*8 + 9*9 + 10*10 + 11*11 + 12*12

1000 未満で連続する平方数の和で表せる回文数はちょうど 11 あり, その合計は 4164 である.
正の整数の平方のみをこの問題では扱うため, 1=0*0+1*1 は含めないことに注意せよ.

回文数であり、かつ、連続する平方数の和で表せる, 10の8乗 未満のすべての数の合計を求めよ.


ソース

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

class Program
{
    //const int LimitVal = 1000;
    const int LimitVal = 100000000;

    struct JyoutaiDef
    {
        internal int Level;
        internal int CurrNum;
        internal int SumVal;
    }

    static void Main()
    {
        var Stk = new Stack<JyoutaiDef>();

        for (int I = 1; I < int.MaxValue; I++) {
            JyoutaiDef WillPush;
            WillPush.Level = 1;
            WillPush.CurrNum = I;
            WillPush.SumVal = I * I;
            if (WillPush.SumVal >= LimitVal) break;
            Stk.Push(WillPush);
        }

        var HeihouSumSet = new HashSet<int>();

        while (Stk.Count > 0) {
            JyoutaiDef Popped = Stk.Pop();
            if (Popped.Level >= 2)
                HeihouSumSet.Add(Popped.SumVal);

            JyoutaiDef WillPush;
            WillPush.Level = Popped.Level + 1;
            WillPush.CurrNum = Popped.CurrNum + 1;
            WillPush.SumVal = Popped.SumVal + WillPush.CurrNum * WillPush.CurrNum;

            if (WillPush.SumVal < LimitVal) Stk.Push(WillPush);
        }

        long AnswerSum = 0;
        foreach (int EachHeihouSum in HeihouSumSet.OrderBy(A => A)) {
            string AscStr = EachHeihouSum.ToString();
            string DescStr = new string(AscStr.ToCharArray().Reverse().ToArray());
            if (AscStr == DescStr) {
                Console.WriteLine("{0}は連続した整数の平方の和であり、回文数", EachHeihouSum);
                AnswerSum += EachHeihouSum;
            }
        }
        Console.WriteLine("該当する数の和は{0}", AnswerSum);
    }
}


実行結果

省略
92800829は連続した整数の平方の和であり、回文数
95177159は連続した整数の平方の和であり、回文数
95544559は連続した整数の平方の和であり、回文数
97299279は連続した整数の平方の和であり、回文数
該当する数の和は2906969179


解説

new string(ascStr.ToCharArray().Reverse().ToArray());
でstring型を反転させて回文数の判定をしてます。