給定乙個十進位制正數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的次數為...