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