計算1的個數 程式設計之美

2021-08-27 10:24:46 字數 1684 閱讀 2390

給定乙個十進位制正數n,寫下從1開始到nde所有正整數,然後數一數其中出現所有「1」的個數。

n = 2; 只有乙個1

n= 12;只有五個1, 1 、、、10,11,12。

分析:一,從1開始遍歷到n,將中每乙個書中含有1的個數加起來。

方法如下:

static int countoneinint(int n) 

return num; }

static int countallones(int num)

system.out.println("countallones const time: " + (system.currenttimemillis() - starttime));

return sum;

}

但是此方法要遍歷所有小於n的數,在效率上存在問題。

二,通過分析「小於n的輸在每一位上可能出現1的次數」

先看1位數的情況。

如果n = 3; 1次 n 》 = 1,f(n) = 1 如果n = 0;則f(n)為0;

再看2位數情況

n= 13 : 1 , 10, 11, ,12, 13 f(n) = 2(個) + 4(十) = 6;

n= 23: 1, 10 、、、19, 21 f(n) = 3 + 10 = 13;

通過對兩位數分析:

1,個位出現1的次數 與個位,十位數有關。當個位上的數大於等於1 則出現一的次數等於十位數上的數字加1;如果個位上的數等於0,則個位上出現1的個數為十位上的數字。

2,十位出現1的次數 如果十位上的數字為1,則十位上出現1的個數為個位數字加1; 如果十位數大於1,這十位上出現1的次數為 10;

f(33) = 4 + 10 = 14;

f(43) = 5 + 10 = 15;

f(93) = 10 + 10 = 20;

如果百位上德爾數字為0,百位上出現1的次數有更高位決定 更高位數字 * 當前位數(類似權重:十位,百位、、、);

如果百位上的數字為1,百位上出現1的次數不僅受高位,還受地位影響 更高位數字 *當前位數 + (地位數字 + 1);

如果百位上的數字大於1,則百位出現1的次數僅由更高位決定 (更高位數字 + 1) × 當前位數。

static int countone(int n) 

ifactor = ifactor * 10;

} system.out.println("countone const time: " + (system.currenttimemillis() - starttime));

return icount;

}

執行結果如下:

public static void main(string args)

請輸入數字n: 

111111111

countallones const time: 16663

first function: 100000008

countone const time: 0

second function: 100000008

由執行結果就可以看出有效率的問題。

還有個人體會就是:想的越多,**越少。所以遇到問題要多想想。

《程式設計之美》統計1的個數

今天看了 入門經典 上的一道題,打算來存個統計位數的模板,一般都是用數字dp來做,但統計單個數字可以特殊處理。題目 對1 n統計1的個數。題目簡單,分析可以看 舉個例子 對於乙個數abcde,取百位上的c來計算,假若c是 1 那麼百位上1的個數是由他的高位和低位來決定的。等於ab 100 cde 1...

程式設計之美系列之三 計算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開始遍歷到n,將其中每乙個數中含有 1 的個數加起來,就得到了問題的解。如下 1...

程式設計之美 計算1 N中含1的個數

點我 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的次數為...