码迷,mamicode.com
首页 > 其他好文 > 详细

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

时间:2020-07-05 22:45:09      阅读:69      评论:0      收藏:0      [点我收藏+]

标签:+=   问题   count   简单   思路   factor   时间复杂度   编程之美   复杂度   

问题:给定一个十进制正整数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的数目”的另一个解法

标签:+=   问题   count   简单   思路   factor   时间复杂度   编程之美   复杂度   

原文地址:https://www.cnblogs.com/xrst/p/13252113.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!