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

Problem206 覆面平方数

問題

二乗すると「1_2_3_4_5_6_7_8_9_0」の形となるような唯一の正整数を求めよ.
ただし, 「_」は1桁の数である.


ソース

using System;

class Program
{
    static void Main()
    {
        long StaVal = (long)Math.Ceiling(Math.Sqrt(1020304050607080900D));

        //10の倍数のみが候補
        long ModVal = StaVal % 10;
        if (ModVal > 0) StaVal = StaVal - ModVal + 10;

        long EndVal = (long)Math.Truncate(Math.Sqrt(1929394959697989990D));

        for (long I = StaVal; I <= EndVal; I += 10) {
            if (I % 10000000 == 0)
                Console.WriteLine("{0}を検証中。残りは{1}", I, EndVal - I);

            if (IsOK(I * I))
                Console.WriteLine("Answer={0}", I);
        }
    }

    static bool IsOK(long pTarget)
    {
        for (int I = 1; I <= 19; I++) {
            long Amari = pTarget % 10;
            if (I == 1 && Amari != 0L) return false;
            if (I == 3 && Amari != 9L) return false;
            if (I == 5 && Amari != 8L) return false;
            if (I == 7 && Amari != 7L) return false;
            if (I == 9 && Amari != 6L) return false;
            if (I == 11 && Amari != 5L) return false;
            if (I == 13 && Amari != 4L) return false;
            if (I == 15 && Amari != 3L) return false;
            if (I == 17 && Amari != 2L) return false;
            if (I == 19 && Amari != 1L) return false;
            pTarget /= 10;
        }
        return true;
    }
}


実行結果

省略
1320000000を検証中。残りは69026623
1330000000を検証中。残りは59026623
1340000000を検証中。残りは49026623
1350000000を検証中。残りは39026623
1360000000を検証中。残りは29026623
1370000000を検証中。残りは19026623
1380000000を検証中。残りは9026623
Answer=1389019170


解説

2乗した時の、1桁目が0なので
10の倍数のみをチェック対象としてます。