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桁以上にはならない
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))