Original

We shall say that an n-digit number is pandigital if it makes use of all the digits 1 to n exactly once; for example, the 5-digit number, 15234, is 1 through 5 pandigital.

The product 7254 is unusual, as the identity, 39 186 = 7254, containing multiplicand, multiplier, and product is 1 through 9 pandigital.

Find the sum of all products whose multiplicand/multiplier/product identity can be written as a 1 through 9 pandigital.

HINT: Some products can be obtained in more than one way so be sure to only include it once in your sum.

和訳

7254は面白い性質を持っている.
39 × 186 = 7254と書け, 掛けられる数/掛ける数/積に1から9の数が1回ずつ出現する.

掛けられる数/掛ける数/積に1から9の数が1回ずつ出現するような積の総和を求めよ.

HINT: いくつかの積は, 1通り以上の掛けられる数/掛ける数/積の組み合わせを持つが1回だけ数え上げよ.

当てにならないソースコード(C#)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
using System;
using System.Collections.Generic;

namespace ProjectEuler {
    class Problem32 : Problem{
        public Problem32() {
            long answer = 0;
            // a * b == c のとき、
            // cの桁数 + aの桁数 + bの桁数 = 9
            // cの桁数 = aの桁数 + bの桁数 - 1
            // より
            // Cの桁数 = 4 のはず
            for (long c = 1234; c <= 9876; c++) {
                if(Pandigital(c)){
                    answer += c;
                }
            }
            Console.WriteLine("> " + answer);
        }
        public bool Pandigital(long c) {
            List<long> clist = MakeList(c);
            if (!AppearOnce(clist)) {
                return false;
            }
            long root = (long)Math.Sqrt(c);
            List<long> divsors = Numerics.DivisorsWithoutSelf(c);
            foreach (long a in divsors) {
                List<long> abc = new List<long>(clist);
                if (a > root)
                    break;
                long b = c / a;
                abc.AddRange(MakeList(a));
                abc.AddRange(MakeList(b));
                if (!AppearOnce(abc) || ExistsDigit(abc, 0) || abc.Count != 9) {
                    continue;
                }
                //Console.WriteLine("a:{0} b:{1} c:{2}", a, b, c);
                return true;
            }
            return false;
        }

        List<long> MakeList(long n) {
            return MakeList(new List<long>(), n);
        }

        List<long> MakeList(List<long> list, long n) {
            while (n > 0) {
                list.Add(n % 10);
                n /= 10;
            }
            return list;
        }

        bool AppearOnce(List<long> list) {
            for(int i=0;i<list.Count;i++){
                for (int j = i+1; j<list.Count;j++ ) {
                    if (list[i] == list[j]) {
                        return false;
                    }
                }
            }
            return true;
        }

        bool ExistsDigit(List<long> digits, long d) {
            foreach(long n in digits){
                if (n == d) {
                    return true;
                }
            }
            return false;
        }
    }
}


積を仮に定めて、約数を求め、条件に合うか調べています。
List多用で読みにくいかもしれません。

Problem 31 Index Problem 33