📜  数字 1 在数字 1 到 1,000 中出现了多少次?(1)

📅  最后修改于: 2023-12-03 15:10:16.962000             🧑  作者: Mango

问题描述

编写一个程序,统计数字 1 在数字 1 到 1,000 中出现的次数。

解题思路

一般来说,解决这种问题的方式是枚举每个数字,然后检查这个数字中 1 的出现次数。但是这种方法的时间复杂度是 $O(n)$,在本题中 $n=1,000$,因此这种方法可能很慢。

我们可以采用一个更聪明的方法。我们可以将数字拆分成几个数字(例如 123 可以拆分成 1、2 和 3),然后分别检查每个数字中 1 的出现次数。接下来,我们以数字 735 为例来说明我们的算法:

  • 对于个位,所有的数字都会出现。因此,它会出现 $\lfloor\frac{735}{10}\rfloor=73$ 次。
  • 对于十位,如果十位上的数字(3)小于 1,则所有的 1 都是从 1~699 中的数中贡献出来的。因此,它会出现 $7\times10=70$ 次。如果十位上的数字等于 1,则 1 的数量取决于个位数和百位数。在本例中,个位上的数是 5,因此会出现 6 次。最后,我们还需要加上百位数(7)到 1 的距离(即 100 到 199)中的所有数贡献出来的 1,即加上 100~199 中的所有数字中 1 的数量,即 $100\times1+1=101$。因此,十位上的 1 的总数是 $70+6+101=177$。
  • 对于百位,如果百位上的数字(7)大于等于 1,则所有的 1 都是从 1~699 中的数中贡献出来的。因此,它会出现 $7\times100=700$ 次。如果百位上的数字等于 1,则 1 的数量取决于十位数和个位数。在本例中,十位数是 3,个位数是 5,因此会出现 36 次。最后,我们还需要加上 1~99 中的所有数字中 1 的数量,即 $1+10=11$。因此,百位上的 1 的总数是 $700+36+11=747$。

使用类似的方法,我们可以计算出 1 到 1,000 中所有数字中 1 的出现次数。

代码实现