從1到n整數中1出現的次數

1n整數中1出現的次數

要計算X出現的次數(spacer.gif),需統計X在每一位出現的次數。

110出現1X1100出現10X11000出現100X

綜上可以得出:從 1 至 10i在它們的左數第二位(右數第 i 位)中任意的 X 都出現了 10i1 次。

Eg:以n=21345,X=1

依次分析X在各位中出現的次數:

個位:因爲21340中有2134個10,所以從1到21340,1出現了2134次;再看從21341到21345,因爲1<5(這裏X爲1,肯定滿足,當X爲任意數時,應判斷X<5是否成立),所以1在個位中出現的次數爲2135次。

十位:因爲21300中有213個100,所以從1到21300,1出現在十位的次數爲213*10次,再看從21301到21345,因爲4>1,所以十位出現的次數爲(213+1)*10^(2-1)=2140.

同理,百位出現的次數爲(21+1)*10^(3-1)=2200.

千位:因爲20000中共有2個10000,所以從1到20000,1出現在千位的次數爲2*1000次,再看從20001到21345,因爲1==1,所以千位中肯定含有1,但不會是1000次,而是345+1=346次(因爲有21000,所以要加1),所以1出現在千位的總次數爲2*10^(4-1)+(345+1)=2346次。

萬位:方法同上,出現的次數爲(0+1)*10^(5-1)=10000.

所以:21345中1出現的次數爲2135+2140+2200+2346+10000=18821次

X在第i位出現的次數的計算方法:

1、取第i位左邊(高位)的數字,乘以10^(i-1),得到基本的sum

2、取第i位數字:

1)如果大於X,則結果sum+=10^(i-1).

2)如果等於X,則結果爲

sum+=(第i位右邊的(低位)的數字)+1

3)如果小於X,則結果就爲sum

代碼如下:

size_t NumberOf1Between1AndN_Solution(size_t n)
{
	char str[12] = { 0 };
	int length = strlen(_itoa(n, str, 10));//計算n的位數
	size_t countSum = 0;
	//爲取第i位數字簡便,所以以下采取str運算
	for (int i = length - 1; i >= 0; --i)
	{
		//取第i位左面的數字
		int tmpLeft = 0;
		for (int j = 0; j < i; ++j)
		{
			tmpLeft = tmpLeft * 10 + str[j] - '0';
		}

		countSum += tmpLeft * pow(10, length - i - 1);
		int iVal = str[i] - '0'; //第i位的數字
		//如果大於X,則結果countSum+=pow(10, i).
		if (iVal > 1)
		{
			countSum += pow(10, length - i - 1);
		}
		//如果等於X,則結果爲countSum+=(第i位右邊的(低位)的數字)+1
		else if (iVal == 1)
		{
			int tmpRight = 0;//計算低位數字
			for (int j = i + 1; j < length; j++)
			{
				tmpRight = tmpRight * 10 + str[j] - '0';
			}
			countSum += tmpRight + 1;
		}
		//如果小於X,則結果就爲countSum
	}
	return countSum;
}


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章