192 に 1, 2, 3 を掛けてみよう. 192 × 1 = 192 192 × 2 = 384 192 × 3 = 576 積を連結することで1から9の パンデジタル数 192384576 が得られる. 192384576 を 192 と (1,2,3) の連結積と呼ぶ. 同じようにして, 9 を 1,2,3,4,5 と掛け連結することでパンデジタル数 918273645が得られる. これは 9 と (1,2,3,4,5) との連結積である. 整数と (1,2,...,n) (n > 1) との連結積として得られる9桁のパンデジタル数の中で 最大のものはいくつか?
using System;
using System.Collections.Generic;
using System.Linq;
class Program
{
static List<int> RenketuSekiList = new List<int>();
static void Main()
{
//5桁の数に1を掛けると5桁以上の数になる。
//5桁の数に2を掛けると5桁以上の数になる。
//これらを連結すると10桁以上なので、4桁の最大値である9999までをチェック
for (int I = 1; I <= 9999; I++) {
CheckRenketuSeki(I);
}
Console.WriteLine("Answer={0}", RenketuSekiList.Max());
}
static void CheckRenketuSeki(int pTarget)
{
Predicate<string> IsPandigital = A => A.OrderBy(B => B).SequenceEqual("123456789");
var sb = new System.Text.StringBuilder();
for (int I = 1; I <= 9; I++) {
sb.Append(pTarget * I);
if (sb.Length == 9 && IsPandigital(sb.ToString())) {
RenketuSekiList.Add(int.Parse(sb.ToString()));
return;
}
if (sb.Length > 9) return;
}
}
}
Answer=932718654
Predicateデリゲートは、HashSetジェネリックを使って
下記のように書くこともできます。
Predicate<string> IsPandigital = A => new HashSet<char>("123456789").SetEquals(A);
MSDN --- HashSet<T> コンストラクタ IEnumerable<T>
MSDN --- HashSet<T>.SetEquals メソッド