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 メソッド