2.2用公式寫出來
2.3**表示
1~13中包含1的數字有1、10、11、12、13,因此「1」共出現6次;首先需要說明的是:題目要求的是「1」的個數而不是含1的數字的個數,也就是說對於數字「11」,是有有兩個「1」的。是要算兩次的!!!!求出任意非負整數區間中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出現的次數。演算法一 暴力累加...