本帖最后由 wangzhenas 于 2016-10-16 20:44 编辑
答案: 210
思路: 列表中储存每位数的个数乘位数,比如两位数有90个(10 - 99)列表中储存2*90即180,三位数900个(100-999)储存900*3即2700
find_num函数找到具体每位数字,i表示目标数位数,rest表示减去i<目标位数后剩余的rest位数字,digit表示一个多位数从左到右中的第几位,this_num即当前数字,this_digit表示目标位数
比如100,rest是90,digit=0,即第45个两位数的第0位,就是55的第0位5,以此类推即可
from time import time
from functools import reduce
def find_digit(l,num):
s = 0
for i in range(1,len(l)):
s += l[i]
if s > num:
rest = num - (s - l[i]) - 1
break
digit,this_num = rest % i, rest//i + 10**(i-1)
this_digit = (this_num//(10**(i-digit-1)))%10
print(digit,this_num,this_digit)
return this_digit
#main
t = time()
#maximum: 10 ** 6
input_num = 6
#parameter,list init
i,l,maxi = 1,[1],10**input_num
while sum(l) <= maxi:
l.append((10**i - 10**(i-1))*i)
i += 1
#find number (10,100,1000,10000,1000000)
print(reduce(lambda x,y: x*y, (find_digit(l,10**i) for i in range(1,input_num+1))), time()-t)
#end
|