标签:+= 问题 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; }
结果验证过是一致的。
标签:+= 问题 count 简单 思路 factor 时间复杂度 编程之美 复杂度
原文地址:https://www.cnblogs.com/xrst/p/13252113.html