题解 | #整数中1出现的次数(从1到n整数中1出现的次数)#Python统计各位上的次数
整数中1出现的次数(从1到n整数中1出现的次数)
http://www.nowcoder.com/practice/bd7f978302044eee894445e244c7eee6
# -*- coding:utf-8 -*- import math class Solution: def NumberOf1Between1AndN_Solution(self, n): # write code here if n == 0: return 0 num = math.floor(math.log(n, 10)) #统计位数:个位0,十位1,百位2 summ = 0 #统计1的个数 head = 0 #统计某一位数时高位的数值,如2105,统计千位时高位为0,统计十位时高位为21. half = n #统计某一位数时的余数,如2105,统计千位时为2105,统计百位时为105. for i in range(num, -1, -1): x = pow(10, i) if half //x == 1: summ += half % x + 1 + head*x #统计位数为1时,百位为1,余数half=05,[100-105]共6个数,高位head=2,[0100-0199,1100-1199]共200个数 elif half // x == 0: summ += head*x #统计位数小于1时,十位为0,高位head=21,此时仅考虑[00-20]为21个数,不考虑21 else: summ += (head+1)*x #统计位数大于1时,千位为2,高位head=0,可包含千位为1,即[1000-1999]为1k个数 half = half % x head = n // x return summ