1. 分析
如果 n = 12 ,即 1 - 12 中含有1 的數有:1 , 10 , 11, 12 則1出現的次數為 5
假如計算 1 - 31245 怎麼計算
第一步 :分為兩段 1 - 1245 和 1246 - 31245
第兩步: 分別計算這兩段中1出現的次數,最後結果相加
首先計算1246 - 31245 這一段的1出現的次數(三種情況):
一,最高位是1時 , 即 10000 - 19999 出現了 (10 ^4) 個1
二 ,假設此時輸入的不是31245 而是 11245 ,那麼計算最高位為1時,就不能像第一種情況那樣計算
計算的是 10000 - 11245 ,最高位為1,出現的次數為(12456)
三,除最高位外,其他位為1的次數:
此時就能夠明白為什麼那樣分為兩段了
1246 - 31245 其實等價於(10000 - 19999)
(20000 - 29999)
(30000 - 31245 31246 - 39999)
(1246 - 9999 10000 - 31245) 有助於理解為什麼這樣排列組合
可以看到除了最高位外,就剩下4位,排列組合它們就行了,從4位中選一位為1,有四種可能,其他三位都是
從0 - 9 中選有10中可能
可以計算到 除最高位外,其他位為1的次數:3 * 4 * (10^3)
注意上面(有三段)
整數1到n中1出現的次數
比如求出1 13的整數中1出現的次數,1 13中包含1的數字有1 10 11 12 13因此共出現6次,把問題更加普遍化,求出任意非負整數區間中1出現的次數 從1 到 n 中1出現的次數 參考自部落格 按位依次計算,計算出現在個位上1的次數,十位上1的次數.對於某一位的1的個數如此計算,比如對980...
整數中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...