首页 > 代码库 > 2.4 1的数目

2.4 1的数目

题目:

    写一个函数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;
}


2.4 1的数目