題目描述:給定乙個十進位制整數n,寫出從1開始到n的所有整數,統計一下其**現所有「1」的個數。
例如12,一共有1、10、11、12四個數**現5次1。
問:1、寫出乙個函式,返回1到n之間出現1的次數
2、滿足條件f(n) = n 的最大的n是多少。
題目解析:
思路一:
我們用粗暴的方式,要求1的個數,那麼我們就跟二進位制中統計1的個數一樣,我們從1->n遍歷,對每乙個數對10求餘,判斷是否為1,然後再除以10,不斷迴圈。時間複雜度為o(nlgn)。
int countone(int n)
}return num;
}
思路二:
當我們分析這個題目的時候,會發現個位十位百位等出現1的數目是有規律的,畢竟對於個位說增加10會有又一次迴圈。
我們還是考慮比較通用的,也更方便我們分析,將題目換成:出現3的次數。對於456和314我們同時討論:
(1)先判斷百位的4,由於4比3大,百位出現了100次3。再考慮314的百位3,由於跟3相等,估百位出現3的次數為(14+1)。因為300也要算。
(2)再考察一下十位的5,由於5比3大,那麼會有30-39,130-139,230-239,330-339,430-439一共50個資料,也就是說當十位大於3的時候出現的個數為(百位數+1)*10。再看看314,有30-39,130-139,230-239一共三十個資料,也就是說當十位小於3的時候,為——百位數*10 ,這時就不需要再加1了。但如果為332呢?十位出現的個數為(百位數*10 +個位數+1)
(3)分析個位的話,與十位相同。
總結:n = abcde 對於百位來說受到三個方面的影響,更高位,百位,低位三者的影響:
1、c為0時,百位出現1的次數為(ab)* 100。
2、c為1時,百位出現1的次數為(ab)* 100 + cd + 1
3、c大於1時,百位出現1的次數為(ab+1)* 100
int countone_1(int n)
factor *= 10;
}return count;
}
問題2:
詳見《程式設計之美》136解釋。
通過舉例子來一點一點得出
整數中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出現的次數。演算法一 暴力累加...