整数中1出现的次数
求出113的整数中1出现的次数,并算出1001300的整数中1出现的次数?为此他特别数了一下1~13中包含1的数字有1、10、11、12、13因此共出现6次,但是对于后面问题他就没辙了。ACMer希望你们帮帮他,并把问题更加普遍化,可以很快的求出任意非负整数区间中1出现的次数(从1 到 n 中1出现的次数)。
题解
大概思路是求出
0-9中 1出现的次数 1次
01-99中 1出现的次数 20次
001-999中 1出现的次数 300次
0001-9999中 1出现的次数 4000次
然后给出任意一个数,比如31345
0-9999的时候 1出现了 4000次
10000 - 19999的时候 1出现了 10000+4000次
20000 - 29999的时候 1出现了 4000次
30000 - 31345的时候 1出现了 0-1345的时候 1出现的次数
这个时候就转换成了 4000*3 + 10000 + (0-1345时候,1出现的次数)
但是当最高位是1的时候,需要特别注意
比如12345
0-9999的时候 1出现了4000次
10000 - 12345的时候 1出现了 最高位中1出现了2346次 + 后四位中(0-2345中1出现的次数)
# -*- coding:utf-8 -*-
class Solution:
def NumberOf1Between1AndN_Solution(self, n):
# write code here
sum = 0
length = len(str(n))
li = []
for i in range(length):
li.append((i+1)*(10**i))
li.insert(0,0)
for i in range(length,0,-1):
x = (n%(10**i))//10**(i-1)
if x>1:
sum += li[i-1] * x + 10**(i-1)
if x == 1:
sum += li[i-1] + n%(10**(i-1))+1
return(sum)