トップページに戻る
次の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型に変換せずに解いてます。