清奇思路(六)從1到n整數中1出現的次數

2021-08-19 17:58:16 字數 2978 閱讀 9530

2.2用公式寫出來

2.3**表示

1~13中包含1的數字有1、10、11、12、13,因此「1」共出現6次;

求出任意非負整數區間中1出現的次數。

首先需要說明的是:題目要求的是「1」的個數而不是含1的數字的個數,也就是說對於數字「11」,是有有兩個「1」的。是要算兩次的!!!!

牛客網該題目下咩咩jiang的回答由於沒有圖,字也擠在一起-_-||,原諒我第一次真的看不進去。

部落格:yi_afly的專欄中從1到n整數中1出現的次數**並茂,講解的很清楚,思路上和上面的大佬是相近的,建議先看yi_afly的再回看咩咩jiang的,可能會稍稍好一些。

下面開始是我整理兩位的發言,梳理的比較有邏輯一點。

yi_afly從個位開始講解,但是最終仍然回歸到一樣的**上去,因此本文這裡先和咩咩jiang一樣,以百位為例,說明如何計算,然後再說明為什麼個位計算方法可以與百位的相同。

我們以數字          3

1 x 5

6 為例 //x表示百位數字不定(0~9)均有可能

那麼,很明顯可以知道,不管x是多少,在round從0~30輪中,百位上有「1」的次數至少是31次,因為百位每一次出現「1」需要持續100次(100-199),因此百位上「1」的個數至少有31∗

100 31

∗100

。這個100是由於百位本身的特性決定的,因此如果我們記x所在的位權重為base,如下圖所示:

那麼,百位上「1」至少出現的次數就是:ro

und∗

base

r ou

nd∗b

ase.

這裡我們應該也知道,在第32輪,也就是round為31的時候,只有31100 - 31199百位上會出現「1」。

所以如果

x>

1 x

>

1,那就是看

100−

199 100

−199

有多少個「1」。因此,如果x>1,百位上「1」的個數有31∗

100+1∗

100 31

∗100+1

∗100

。那麼,此時百位上「1」出現的次數就是:(r

ound

+1)∗

base

( ro

und+

1)∗b

ase.

在第32輪,也就是round為31的時候,只有31100 - 31199百位上會出現「1」。所以,如果x==

0 x==0

,那就是看

31000

−31056

31000

−31056

有多少個「1」。很明顯沒有。

那麼,此時百位上「1」出現的次數就是:(r

ound

)∗ba

se( ro

und)

∗bas

e.在第32輪,也就是round為31的時候,只有31100 - 31199百位上會出現「1」。所以,如果x==

1 x==1

,那就是看

31100

−31156

31100

−31156

有多少個「1」。取決於百位後面的數字是多少。

如果我們記百位後面的數字為former,如圖所示:

那麼,此時百位上「1」出現的次數就是:(r

ound

)∗ba

se+f

orme

r+1 (ro

und)

∗bas

e+fo

rmer

+1.1.r

ound

=n/b

ase/

10的商 1.ro

und=

n/ba

se/10

的商2.fo

rmer

=n/b

ase的

餘數2.fo

rmer

=n/b

ase的

餘數百位上「1」出現的次數就是: ro

und+

ϵ(x−

1))∗

base

+(fo

rmer

+1)∗

δ(x−

1)r ou

nd+ϵ

(x−1

))∗b

ase+

(for

mer+

1)∗δ

(x−1

)其中,ϵ(

x)是階

躍函式,

δ(x)

是衝激函

數 ϵ(x)

是階躍函

數,δ(

x)是衝激函式

int numberofones(int n)

return count;

}

當然,根據上述思路還有一些其他的**表示,也很精妙,但是我個人覺得不如我這個來的直觀。

最後說一說為什麼個位也可以用,因為個位的former為0。不會影響到個位整體計算公式的。

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