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秒くらい