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

Cマガ電脳クラブ(第095回) 大町平方数

問題

5桁の数がある。その2乗は10桁の数になり、0から9までの数字を1字ずつ含んでいた。
また、その5桁の数の数字を逆に並べ直してその2乗を計算したら、同じように0から9までの数字を1字ずつ含んでいた。
でも、5桁の数は回文数ではなかった。

その数を求めなさい。
なお、数の左端の桁の数字は0でない。
また、回文数とは、たとえば12321のように、逆に並べても同じになる数のことである。


ソース

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

class Program
{
    static void Main()
    {
        for (long I = 10000; I <= 99999; I++) {
            //平方が、最大の大町数を超えたらBreak
            if (I * I > 9876543210) break;

            //平方が、最小の大町数未満ならContinue
            if (I * I < 1023456789) continue;

            //平方が、大町数であること
            if (IsOomatiSuu(DeriveNumArr(I * I)) == false) continue;

            //数の左端の桁の数字は0でない
            if (I % 10 == 0) continue;

            long[] NumArr = DeriveNumArr(I);
            long RevVal = 0;
            foreach (long EachNum in NumArr) {
                RevVal *= 10;
                RevVal += EachNum;
            }

            //5桁の数は回文数ではない
            if (I == RevVal) continue;

            //平方が、大町数であること
            if (IsOomatiSuu(DeriveNumArr(RevVal * RevVal)) == false) continue;

            Console.WriteLine(I);
        }
    }

    //数字の配列を返す
    static long[] DeriveNumArr(long pTargetNum)
    {
        var WillReturn = new List<long>();

        long CopiedVal = pTargetNum;
        do {
            long ModVal = CopiedVal % 10;
            WillReturn.Add(ModVal);
        } while ((CopiedVal /= 10) > 0);
        return WillReturn.ToArray();
    }

    //大町数かを判定
    static bool IsOomatiSuu(long[] pTargetArr)
    {
        bool[] IsAppearedArr = new bool[10];

        foreach (long EachLong in pTargetArr) {
            //同じ数字を2個以上含んだらNG
            if (IsAppearedArr[EachLong]) return false;
            IsAppearedArr[EachLong] = true;
        }
        return Array.TrueForAll(IsAppearedArr, X => X);
    }
}


実行結果

54918
81945


解説

Long型からString型に変換せずに解いてます。