統計0到n之間1的個數 數學

2021-07-01 23:02:59 字數 2268 閱讀 8888

給定乙個十進位制整數n,求出從1到n的所有整數中出現」1」的個數。

例如:n=2時 1,2出現了1個 「1」 。

n=12時 1,2,3,4,5,6,7,8,9,10,11,12。出現了5個「1」。

方法一 暴力求解

最直接的方法就是從1開始遍歷到n,將其中每乙個數中含有「1」的個數加起來,就得到了問題的解。

**如下:

01/**

02* created by gaotong on 2014/11/19.

03

04*/

05publicclasscountones

19}

20returncount;

21}

22

23publicstaticvoidmain(string args)

28}

該演算法的時間複雜度為o(n*lgn)

解法二

1位數的情況:

在解法二中已經分析過,大於等於1的時候,有1個,小於1就沒有。

2位數的情況:

n=13,個位數出現的1的次數為2,分別為1和11,十位數出現1的次數為4,分別為10,11,12,13,所以f(n) = 2+4。

n=23,個位數出現的1的次數為3,分別為1,11,21,十位數出現1的次數為10,分別為10~19,f(n)=3+10。

由此我們發現,個位數出現1的次數不僅和個位數有關,和十位數也有關,如果個位數大於等於1,則個位數出現1的次數為十位數的數字加1;如果個位數為0,個位數出現1的次數等於十位數數字。而十位數上出現1的次數也不僅和十位數相關,也和個位數相關:如果十位數字等於1,則十位數上出現1的次數為個位數的數字加1,假如十位數大於1,則十位數上出現1的次數為10。

3位數的情況:

n=123

個位出現1的個數為13:1,11,21,…,91,101,111,121

十位出現1的個數為20:10~19,110~119

百位出現1的個數為24:100~123

我們可以繼續分析4位數,5位數,推導出下面一般情況: 

假設n,我們要計算百位上出現1的次數,將由三部分決定:百位上的數字,百位以上的數字,百位一下的數字。

如果百位上的數字為0,則百位上出現1的次數僅由更高位決定,比如12013,百位出現1的情況為100~199,1100~1199,2100~2199,…,11100~11199,共1200個。等於更高位數字乘以當前位數,即12 * 100。

如果百位上的數字大於1,則百位上出現1的次數僅由更高位決定,比如12213,百位出現1的情況為100~199,1100~1199,2100~2199,…,11100~11199,12100~12199共1300個。等於更高位數字加1乘以當前位數,即(12 + 1)*100。

如果百位上的數字為1,則百位上出現1的次數不僅受更高位影響,還受低位影響。例如12113,受高位影響出現1的情況:100~199,1100~1199,2100~2199,…,11100~11199,共1200個,但它還受低位影響,出現1的情況是12100~12113,共114個,等於低位數字113+1。

綜合以上分析,寫出如下**:

01publiclongcountone2(longn)

19returncount;

20}

統計0到n之間1的個數

問題描寫敘述 給定乙個十進位制整數n,求出從1到n的全部整數 現 1 的個數。比如 n 2時 1,2出現了1個 1 n 12時 1,2,3,4,5,6,7,8,9,10,11,12。出現了5個 1 1位數的情況 在解法二中已經分析過,大於等於1的時候。有1個,小於1就沒有。2位數的情況 n 13,個...

統計0到n之間1的個數

問題描述 給定乙個十進位制整數n,求出從1到n的所有整數 現 1 的個數。例如 n 2時 1,2出現了1個 1 n 12時 1,2,3,4,5,6,7,8,9,10,11,12。出現了5個 1 1位數的情況 在解法二中已經分析過,大於等於1的時候,有1個,小於1就沒有。2位數的情況 n 13,個位數...

1的個數 數學

時間限制 1000 ms 記憶體限制 65535 kb 難度 3 描述 給你兩個數a和b,你的任務是計算出1在a和b之間出現的次數,比如說,如果a 1024,b 1032,那麼a和b之間的數就是 1024 1025 1026 1027 1028 1029 1030 1031 1032 則有10個1出...