Project Euler Problem 32

3個の数を
a * b = c
a < b
とする

3個の数の桁数について、成立する場合は下記の2通り
(aの桁数, bの桁数, cの桁数)
(1, 4, 4)
(2, 3, 4)

理由は、
(1) aが1桁の場合

(1-1) bが3桁の場合
cが5桁にならなければならない
(なぜなら、aの桁数 + bの桁数 + cの桁数 = 9にならなければならないから)
a * bの最大値は、9 * 999 = 8991であり、5桁にとどかない
したがって、成立しない
bが2桁以下の場合も同様に成立しない

(1-2) bが5桁の場合
cが3桁にならなければならない
a * bの最小値は、1 * 10000 = 10000であり、3桁におさまらない
したがって、成立しない
bが6桁以上の場合も同様に成立しない

したがって、aが1桁の場合は、bは4桁でなければならない

(2) aが2桁の場合
a < bより、bは2桁以上である

(2-1) bが2桁の場合
cが5桁にならなければならない
a * bの最大値は、99 * 99 = 9801であり、5桁にとどかない
したがって、成立しない

(2-2) bが4桁の場合
cが3桁にならなければならない
a * bの最小値は、10 * 1000 = 10000であり、3桁におさまらない
したがって、成立しない
bが5桁以上の場合も同様に成立しない

したがって、aが2桁の場合は、bは3桁でなければならない

(3) aが3桁の場合
a < bより、bは3桁以上である
(3-1) bが3桁の場合
cが3桁にならなければならない
a * bの最小値は、100 * 100 = 10000であり、3桁におさまらない
したがって、成立しない
bが4桁以上の場合も同様に成立しない

aが4桁以上の場合も同様に成立しない
したがって、aが3桁以上にはならない

Python

def is_pandigital(a, b, c):
    s = str(a) + str(b) + str(c)
    for i in range(1, 10):
        if str(i) not in s:
            return False
    return True

answer = set()
for a in range(1, 10):
    for b in range(1000, 10000):
        c = a * b
        if c > 9999:
            break
        if is_pandigital(a, b, c):
            answer.add(c)

for a in range(10, 100):
    for b in range(100, 1000):
        c = a * b
        if c > 9999:
            break
        if is_pandigital(a, b, c):
            answer.add(c)

print(sum(answer))