《编程之美》“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的数目”的另一个解法的主要内容,如果未能解决你的问题,请参考以下文章