This commit is contained in:
ShusenTang 2020-07-10 22:50:45 +08:00 committed by GitHub
parent af4b9b1bfc
commit 63741dd9dc
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23

View File

@ -8,7 +8,7 @@
比较好想的是递归法,核心思想就是每次去掉最高位。
* 递归出口:当`n < 1`时直接返回0
* 否则我们假设n表示成"aB"的形式其中a代表n的最高位B代表其余位例如若 n = 2345 则a=2B=345。我们还令M为与n位数相同的最小的数即若 n=2345 则 M = 1000。所以很明显我们有等式`n = a * M + B`。
* 先考虑出现在最高位的1的个数。所以这里需要考虑a是否为1若是则有B+1个否则有M个例如若n = 1234那么千位的1就有235个即1000~1234若n = 2234则有1000个即1000~1999
* 先考虑出现在最高位的1的个数。所以这里需要考虑a是否为1若是则有B+1个否则有M个例如若n = 1234那么千位的1就有235个即1000至1234若n = 2234则有1000个即1000至1999
* 再考虑非最高位的1的个数。0到`a*M`中出现在非最高位的1的个数为`a*countDigitOne(M-1)`例如0~3000中出现在非最高位即个十百位的1的个数为`3*countDigitOne(999)``a*M+1`到`a*M+B`中出现在非最高位的1的个数为`a*countDigitOne(B)`例如3001到3421中出现在非最高位即个十百位的1的个数为`countDigitOne(421)`。
* 综上总的1的个数为`a * countDigitOne(M - 1) + countDigitOne(B) + (a == 1 ? B + 1 : M)`。
@ -25,7 +25,7 @@
* 此时a的个位的值有三种情况
* a的个位大于1。例如 n = 31456则 a = 314a的个位是4。此时1-n的百位是1的次数为`32*100`即形为A1BA为0-31B为0-99
* a的个位等于1。即n的百位是1例如 n = 31156则 a = 311。此时0-n的百位是1的次数为`31*100 + 56 + 1`即形为A1BA为0-30B为0-99或者311CC为0到56
* a的个位等于0。即n的百位是1,例如 n = 31056则 a = 310。此时0-n的百位是1的次数为`31*100`即形为A1BA为0-30B为0-99
* a的个位等于0。即n的百位是0,例如 n = 31056则 a = 310。此时0-n的百位是1的次数为`31*100`即形为A1BA为0-30B为0-99
|n的百位| 0到n的百位是1的次数 | n举例 | a | b | 0到n的百位是1的次数 |
|--- | --- | --- | --- | --- | --- |