Project Euler Problem 040

http://projecteuler.net/index.php?section=problems&id=40
http://odz.sakura.ne.jp/projecteuler/index.php?cmd=read&page=Problem%2040

正の整数を順に連結して得られる以下の10進の無理数を考える:

0.123456789101112131415161718192021...
小数第12位は1である.

dnで小数第n位の数を表す. d1 × d10 × d100 × d1000 × d10000 × d100000 × d1000000 を求めよ.

いちいち連結していたら時間がかかるので、ダイレクトに参照する

import math
import operator
import itertools
import datetime


def d(n):
    val  = 1
    stop = 1
    
    for i in itertools.count(1):
        c = val * 9
        
        m = n - stop
        stop += i * c
        
        if n < stop:
            val = val + (m / i)
            div = int(math.pow(10, (i - 1) - (m % i)))
            return (val / div) % 10
        val *= 10


def euler040():
    l = [ d(i) for i in [1,10,100,1000,10000,100000,1000000] ]
    print l, reduce(operator.mul, l)

        
begin = datetime.datetime.now()
euler040()
end = datetime.datetime.now()
print end - begin

答え: 210 (1 * 1 * 5 * 3 * 7 * 2 * 1)
実行時間: 0.001353秒くらい