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

Problem43 独特な部分列被整除性を持つPandigital数

問題

数1406357289は0から9のPandigital数である (0から9が1度ずつ現れるので).
この数は部分列が面白い性質を持っている.

d1を1桁目, d2を2桁目の数とし, 以下順にdnを定義する.
この記法を用いると次のことが分かる.

d2 d3  d4=406は2で割り切れる
d3 d4  d5=063は3で割り切れる
d4 d5  d6=635は5で割り切れる
d5 d6  d7=357は7で割り切れる
d6 d7  d8=572は11で割り切れる
d7 d8  d9=728は13で割り切れる
d8 d9 d10=289は17で割り切れる
このような性質をもつ0から9のPandigital数の総和を求めよ.


ソース

using System;
using System.Collections.Generic;

class Program
{
    static void Main()
    {
        var Stk = new Stack<string>();
        for (int I = 1; I <= 9; I++)
            Stk.Push(I.ToString());

        long Answer = 0;
        while (Stk.Count > 0) {
            string Popped = Stk.Pop();
            if (Popped.Length == 10) {
                Answer += Convert.ToInt64(Popped);
                Console.WriteLine("{0}は、条件を満たすPandigital数", Popped);
            }

            for (int I = 0; I <= 9; I++) {
                if (Popped.Contains(I.ToString()) == false) {
                    string WillPush = Popped + I.ToString();
                    if (WillEdakiri(WillPush) == false) {
                        Stk.Push(WillPush);
                    }
                }
            }
        }
        Console.WriteLine("答えは、{0}", Answer);
    }

    static bool WillEdakiri(string pTarget)
    {
        int Length = pTarget.Length;
        if (Length == 4) return (int.Parse(pTarget.Substring(1, 3)) % 2) != 0;
        if (Length == 5) return (int.Parse(pTarget.Substring(2, 3)) % 3) != 0;
        if (Length == 6) return (int.Parse(pTarget.Substring(3, 3)) % 5) != 0;
        if (Length == 7) return (int.Parse(pTarget.Substring(4, 3)) % 7) != 0;
        if (Length == 8) return (int.Parse(pTarget.Substring(5, 3)) % 11) != 0;
        if (Length == 9) return (int.Parse(pTarget.Substring(6, 3)) % 13) != 0;
        if (Length == 10) return (int.Parse(pTarget.Substring(7, 3)) % 17) != 0;
        return false;
    }
}


実行結果

4160357289は、条件を満たすPandigital数
4130952867は、条件を満たすPandigital数
4106357289は、条件を満たすPandigital数
1460357289は、条件を満たすPandigital数
1430952867は、条件を満たすPandigital数
1406357289は、条件を満たすPandigital数
答えは、16695334890


解説

枝切りしながら深さ優先探索してます。