Project Euler Problem 038
http://projecteuler.net/index.php?section=problems&id=38
http://odz.sakura.ne.jp/projecteuler/index.php?cmd=read&page=Problem%2038
192を1, 2, 3で掛けてみよう. 192 × 1 = 192 192 × 2 = 384 192 × 3 = 576 積を連結することで1から9のPandigital数 192384576 が得られる. 192384576を 192と(1,2,3)の連結積と呼ぶ. 同じようにして, 9を1,2,3,4,5と掛け連結することでPandigital数918273645が得られる. これは9と(1,2,3,4,5)との連結積である. 整数と(1,2,...,n) (n > 1) との連結積として得られる9桁のPandigital数の中で最大のものを答えよ.
import math import itertools import datetime def is_pandigital(n, used): while n: m = n % 10 if m in used: return False used.add(m) n /= 10 return True def nlen(n): if n == 1: return 1 return int(math.ceil(math.log(n) / math.log(10))) def msd(n): return n / int(math.pow(10, nlen(n) - 1)) def euler038(): maxv = 123456789 msdi = 1 i = 2 while i < 10000: if msd(i) < msdi: i += int(math.pow(10, nlen(i)-1)) continue v = 0 used = set([0]) for j in itertools.count(1): x = i * j v *= int(math.pow(10, nlen(x))) v += x if not is_pandigital(x, used): break if len(used) == 10: print i,j,v if v > maxv: maxv = v msdi = msd(v) i += 1 print maxv begin = datetime.datetime.now() euler038() end = datetime.datetime.now() print end - begin
答え: 932718654 (9327 と (1, 2) の連結数)
実行時間: 0.011583秒くらい