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

2021-07-12 04:39:01 字數 1712 閱讀 1528

從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出現的次數。演算法一 暴力累加...