本题的想法有很多,其中比较清晰容易实现的思路是:逐位查看,看该位上为1的符合条件的整数有多少个,然后将该整数的个数累加进最后的答案。这样虽然看上去是在数整数的个数,但其实最终得到的就是digit为1的总个数。
举个例子。考虑n=345Y78,(Y是任意的数,待定),我们想考察有多少个符合要求的整数,使得其百位上可以是1.
(1) 如果前三位任取000-344之一(共345种可能),那么最低两位可以任意取00-99(共100种可能)都不会超过n。这样的数有345*100=34500个。第一个乘数就是n的前三位,第二个乘数就是10的二次方。
(2) 如果前三位取345 (不可能更大了),我们就要考虑Y的影响。
a. 如果Y>1,那么最低两位可以任意取00-99(共100种可能)都不会超过n。这样的数有100个。
b. 如果Y==1,那么最低两位不可以随便取,只能取00-78(共79种可能)。这个数字就是n的末两位加上1.
c. 如果Y<1,那么最低两位如论取什么,都会导致这个数大于n,不符合条件。
综合整理上述的分类讨论方案,可以将它适用于任何一个数位(个位、十位、千位、万位...),将这些数的统计全部加起来就是答案。
此题和1067. Digit Count in Range
非常相似。