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

Cマガ電脳クラブ(第160回) 年子平方数

問題

偶数桁の平方数(ある数を2乗してできる数)で、それぞれ同じ桁数になるように左右半分に割ったとき、
その2つの数が連続した2数になっているものを、「年子(としご)平方数」と呼ぶことにする。
たとえば、
 8281 (=91の2乗)
では81と82が連続した2数となっている。
ただし、右半分と左半分、どちらが大きくてもかまわない。

ここでは正の整数のみを扱い、すなおに10進法で考える。
この「年子平方数」をほかにも見つけてほしいのだが、
たくさんあるので、小さいほうから順に(上記の例を含めて)21番目までをお答えいただきたい。  


ソース

using System;

class Program
{
    static int mAnswerCnt = 0;

    static void Main()
    {
        var sw = System.Diagnostics.Stopwatch.StartNew();
        for (int I = 1; I < int.MaxValue; I++) {
            AnswerCheak(I, I - 1);
            if (mAnswerCnt == 21) break;
            AnswerCheak(I, I + 1);
            if (mAnswerCnt == 21) break;
        }
        Console.WriteLine("経過時間={0}", sw.Elapsed);
    }

    static void AnswerCheak(int pHidariVal, int pMigiVal)
    {
        int Mod10 = pMigiVal % 10;
        if (Mod10 == 2 || Mod10 == 3 || Mod10 == 7 || Mod10 == 8)
            return;

        int MigiKetaSuu = DeriveKetasuu(pMigiVal);

        if (Mod10 == 0 || Mod10 == 9)
            if (DeriveKetasuu(pHidariVal) != MigiKetaSuu)
                return;

        long HeihouSuu = pHidariVal;
        for (int I = 1; I <= MigiKetaSuu; I++) HeihouSuu *= 10;
        HeihouSuu += pMigiVal;

        int SqrtVal;
        if (IsHeihouSuu(HeihouSuu, out SqrtVal)) {
            mAnswerCnt++;
            Console.WriteLine("解{0}を発見。{1}の2乗={2}", mAnswerCnt, SqrtVal, HeihouSuu);
        }
    }

    //桁数を求める
    static int DeriveKetasuu(int pVal)
    {
        if (pVal <= 9) return 1;
        if (pVal <= 99) return 2;
        if (pVal <= 999) return 3;
        if (pVal <= 9999) return 4;
        if (pVal <= 99999) return 5;
        if (pVal <= 999999) return 6;
        if (pVal <= 9999999) return 7;
        if (pVal <= 99999999) return 8;
        if (pVal <= 999999999) return 9;
        return 10;
    }

    //平方数かを判定
    static bool IsHeihouSuu(long pVal, out int pSqrtVal)
    {
        pSqrtVal = (int)(Math.Truncate(Math.Sqrt(pVal)));
        return (long)pSqrtVal * (long)pSqrtVal == pVal;
    }
}


実行結果

解1を発見。91の2乗=8281
解2を発見。428の2乗=183184
解3を発見。573の2乗=328329
解4を発見。727の2乗=528529
解5を発見。846の2乗=715716
解6を発見。7810の2乗=60996100
解7を発見。9079の2乗=82428241
解8を発見。9901の2乗=98029801
解9を発見。36365の2乗=1322413225
解10を発見。63636の2乗=4049540496
解11を発見。326734の2乗=106755106756
解12を発見。673267の2乗=453288453289
解13を発見。733674の2乗=538277538276
解14を発見。999001の2乗=998002998001
解15を発見。4545454の2乗=20661152066116
解16を発見。5454547の2乗=29752082975209
解17を発見。47058823の2乗=2214532822145329
解18を発見。52941178の2乗=2802768328027684
解19を発見。88225295の2乗=7783702677837025
解20を発見。99990001の2乗=9998000299980001
解21を発見。331983807の2乗=110213248110213249
経過時間=00:00:35.1161896


解説

右半分の数を小さい数から順にループさせて
年子平方数かをチェックしてます。