《编程之美》“1的数目”的另一个解法

Posted xrst

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了《编程之美》“1的数目”的另一个解法相关的知识,希望对你有一定的参考价值。

问题:给定一个十进制正整数N,写下从1开始,到N的所有整数,然后数一下其中出现的所有“1”的个数。

书上给的最优解,考虑十进制表示的每一位,对于0,1,其他这三种情况分开讨论,然后结合高位数字、当前位数字、低位数字计算。

我想到的是另一个解法,时间复杂度一样,思路类似,但做法更简单一些:

   1
   2
   3
....
  10
  11
  12
....
 100
 101
 102
....
1000
1001
1002

个位数的1:每10个有1个

十位数的1:每100个有10个

百位数的1:每1000个有100个

千位数的1:每10000个有1000个

...

例如考虑百位数上的1,先看有几个整千,计算100*(N/1000)。然后考虑剩余的不到1000的部分,从100算起有几个(注意不到100的不算,大于等于200的也不算)。两部分加起来即可。

C++17代码实现如下:

int count1(int n)
{
    int iCount = 0;
    int iFactor = 1;

    while (n / iFactor != 0)
    {
        int iFactorH = iFactor * 10;
        iCount += iFactor * (n / iFactorH)
            + std::clamp(n % iFactorH - iFactor + 1, 0, iFactor);

        iFactor *= 10;
    }

    return iCount;
}

结果验证过是一致的。

以上是关于《编程之美》“1的数目”的另一个解法的主要内容,如果未能解决你的问题,请参考以下文章

《编程之美》区间重合判断的一些思考

编程之美寻找数组中的最大值和最小值

编程之美----字符串移位包含的问题

编程之美数组分割

编程之美-1的个数

编程之美 2.4