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

Problem38 パンデジタル倍数

問題

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