首页 > 代码库 > 在从1到n的正数中1出现的次数

在从1到n的正数中1出现的次数

网上很多帖子写这个问题,看了下方法基本上是以下两种:爆破、按位统计,但是按位统计都写了很长的统计过程,其实就是一个动态规划的过程

f(n) = f(n/10) * 10 + n/10 + 1  当n%10 != 0 时,否则为f(n) = f(n/10) * 10 + n/10

下面解释下第一种情况(后面的是特例,也很好理解)

  • 公式中红色部分:固定个位数1,1-9中只有1个1;大于9的数中固定个位数为1,则起始数为11,结束值为X1,这里X为n/10,共n/10个数
  • 公式中蓝色部分:对于子问题f(n/10)中每个可以出现的1,都可以为f(n)贡献10个1,这是因为个位数取值范围为0-9