题目:
写一个函数f(n),返回1到N之间出现的“1”的个数。
从特殊情况推导到一般情况。
分为该位数是0、1、其他。。
(1)如果这位上的数字是0的话,那么这个位上出现1的次数仅有更高位决定。
(2)如果这位上的数字是1的话,那么这个位上出现的1的次数不仅跟更高位有关,还跟更低位有关。
· (3)如果这位上的数字是其他(2-9)的话,那么这个位上出现1的次数仅由更高位决定。
代码如下:
__int64 Sum1s(__int64 n) { __int64 iCount = 0; __int64 iFactor = 1; __int64 iLowerNum = 0; __int64 iCurrNum = 0; __int64 iHigherNum = 0; while(n / iFactor != 0) { iLowerNum = n - (n / iFactor) * iFactor; iCurrent = (n / iFactor) % 10; iHigherNum = n / (iFactor * 10); switch(iCurrNum) { case 0: iCount += iHigherNum * iFactor; break; case 1: iCount += iHigherNum * iFactor + iLowerNum + 1; break; default: iCount += (iHigherNum + 1) * iFactor; break; } iFactor *= 10; } return iCount; }
时间: 2024-12-27 12:11:30