從1到n
整數中1
出現的次數
要計算x
出現的次數(
在每一位出現的次數。
1到10出現1
次x;1
到100
出現10次x
;1到1000
出現100次x
。綜上可以得出:
從 1 至 10i
,在它們的左數第二位(右數第
i 位)中
,任意的 x 都出現了
10i1 次。e
g:以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),
得到基本的
sum2、取第
i位數字:
1)如果大於
x,則結果
sum+=10^(i-1).
2)如果等於
x,則結果為
sum+=(第
i位右邊的(低位)的數字)
+13)如果小於
x,則結果就為
sum**如下:
size_t numberof1between1andn_solution(size_t n)
; int length = strlen(_itoa(n, str, 10));//計算n的位數
size_t countsum = 0;
//為取第i位數字簡便,所以以下採取str運算
for (int i = length - 1; i >= 0; --i)
countsum += tmpleft * pow(10, length - i - 1);
int ival = str[i] - '0'; //第i位的數字
//如果大於x,則結果countsum+=pow(10, i).
if (ival > 1)
//如果等於x,則結果為countsum+=(第i位右邊的(低位)的數字)+1
else if (ival == 1)
countsum += tmpright + 1;
} //如果小於x,則結果就為countsum
} return countsum;
}
整數中1出現的次數(從1到n整數中1出現的次數)
求出1 13的整數中1出現的次數,並算出100 1300的整數中1出現的次數?為此他特別數了一下1 13中包含1的數字有1 10 11 12 13因此共出現6次,但是對於後面問題他就沒轍了。acmer希望你們幫幫他,並把問題更加普遍化,可以很快的求出任意非負整數區間中1出現的次數。include u...
整數中1出現的次數(從1到n整數中1出現的次數)
時間限制 1秒 空間限制 32768k 題目描述 include using namespace std class solution 求之前的length 1位中含乙個數 int base1 0 int base2 1 for int i 0 i1 i cout cout cout 求從base2...
整數中1出現的次數(從1到n整數中1出現的次數)
求出1 13的整數中1出現的次數,並算出100 1300的整數中1出現的次數?為此他特別數了一下1 13中包含1的數字有1 10 11 12 13因此共出現6次,但是對於後面問題他就沒轍了。acmer希望你們幫幫他,並把問題更加普遍化,可以很快的求出任意非負整數區間中1出現的次數。演算法一 暴力累加...