|
发表于 2016-10-16 20:30:37
|
显示全部楼层
本帖最后由 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
复制代码 |
评分
-
查看全部评分
|