從1到n整數中1出現的次數ide
要計算X出現的次數(),需統計X在每一位出現的次數。url
1到10出現1次X;1到100出現10次X;1到1000出現100次X。spa
綜上能夠得出:從 1 至 10i,在它們的左數第二位(右數第 i 位)中,任意的 X 都出現了 10i1 次。ci
Eg:以n=21345,X=1it
依次分析X在各位中出現的次數:io
個位:由於21340中有2134個10,因此從1到21340,1出現了2134次;再看從21341到21345,由於1<5(這裏X爲1,確定知足,當X爲任意數時,應判斷X<5是否成立),因此1在個位中出現的次數爲2135次。class
十位:由於21300中有213個100,因此從1到21300,1出如今十位的次數爲213*10次,再看從21301到21345,由於4>1,因此十位出現的次數爲(213+1)*10^(2-1)=2140.方法
同理,百位出現的次數爲(21+1)*10^(3-1)=2200.im
千位:由於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; }