题意:给定一个十进制的整数N,求1到N的所有整数中“1”出现的个数
解题思路:最简单的一种方法是对1到N中的每个整数的每一位进行判断,使用除法与取余的方式,这种方法的时间复杂度是O(N*logN)
解法一:
编程之美中通过分析,总结了这样的一个规律:
假设要处理的数据N=abcde,现在要计算百位上出现1的次数,则它受三个因素的影响:百位上的数字(iCurNum)、百位以上的数字(iHigherNum)、百位以下的数字 (iLowerNum)
(1)如果iCurNum = 0, 则百位上可能出现1的次数由更高位决定,等于更高位数字乘以当前位数(iHigherNum * 100)
(2)如果iCurNum = 1, 则百位上可能出现1的次数不仅由更高位决定,还受低位的影响。等于更高位数字乘以当前位数+低位数字+ 1(iHigherNum * 100 +iLowerNum + 1)
(3)如果iCurNum > 1,则百位上可能出现1的次数仅由更高位决定,等于(更高位数字+1)* 当前位数((iHigherNum + 1) * 100)