程式設計之美 2 4從1到N中1出現的數目

2021-09-30 12:02:07 字數 1276 閱讀 5952

題目描述:給定乙個十進位制整數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出現的次數。演算法一 暴力累加...