考官直接問,1到1000到多少個7?
要求,不程式設計,直接給出答案,並簡單給出思路。
————————第一種思路——————————
首先應該有個合理的歸類,我一開始就想到了乙個合理的分類法,即
1到1000,每個數都看作3位數,而1000明顯沒有7,不考慮
那1看成001,19看成019,以此類推
這樣每個數字可以用三個格仔表示,就有了乙個統一的表示方法
口口口
第一步,只考慮後面兩個格仔。
我最初只想第一種情況,x7,即07,17,一直到97,其中先不考慮77的特殊性(隔離的思想),這樣從0~9有10個7,再考慮77,就有11個7。
還有一種情況,7x,即70,71,一直到79,情況同上,也有11個7。
這兩種情況都算上了77裡面的兩個7,因此減去2。結果是22-2 = 20。
第二步,考慮第乙個格仔。
第乙個格仔,從0~9,即有10種上述情況,其中7比較特殊,我們先不把它當作7(隔離的思想),那麼情況簡單了,一共有10*20 = 200個7。
第三步,考慮剛才被隔離掉的7。
這一步容易想歪,覺得是不是+20呢? 其實應該仔細想下,701, 719, 722這些都多了1個7,那777呢?仔細想下,777裡面的後面2個7也是前面已經算過了。
那就很明朗了。就是剛才的隔離,僅僅忽略了從00~99這100個數中前面含乙個7的情況。
所以,最後的答案是200+100 = 300。
假定前面的結果用f(3)表示
不難歸納,1到10000,即f(4) = 10*f(3) + 1000即4000
————————另外一種思路——————————
題目問有多少個7,如果問有多少1,或者2,或者9呢?不難猜想1~9情況是一樣的。先忽略掉1000裡面多的乙個1。
有沒有可能求出有多少個0,然後再求出1~1000這些數字的字元總數,再減去0的個數後,再除以9呢?
第一步:求1~1000這些數字的字元總數
1位數,9個
2位數,90個*2 = 180個(1~99有99個,減去9)
3位數,900個*3 = 2700個(類似上面10~99,這裡是100~999)
4位數,1*4 = 4
總數是2700+180+9+4 = 2893個字元
第二步:求有多少個0
1位數,沒有
2位數,只考慮x0的情況,從10~99,有9個
3位數,要考慮0x和x0兩種情況,各11個,減去重複的2個,即2*11-2 = 20, 從100~999有9種情況,即9*20 = 180個
4位數,3個0
那結果是2700+180+9+4 - 180+9-3 = 2701個
這樣減去1000裡面多的那個1,剛好是2700個了。
那結果好辦了,不考慮這個1,1~9都是出現2700/9 = 300次。
這個解法是間接求,比直接求更麻煩了些。
總結就是:
表示方法和分類很重要,多採用隔離法(高中物理最好用的方法之一),可以做到簡化問題,方便分析。
————————排列組合法——————————
XTU OJ 迴圈3 有多少個1?
計算機中儲存的整數都是按補碼的型式,乙個32位有符號整數的補碼的定義為 如果x 0,則x的補碼等於x的二進位制表示 如果x 0,那麼x的補碼為2 32 x的二進位制表示。請根據給定的整數,求出它的補碼包含有多少位為1。輸入每行乙個樣例,為乙個整數 可以用int表示 輸出每行輸出乙個對應樣例的結果。s...
每日一題之 經典面試題 N!末尾有多少個0
問題 n的階乘 n 中的末尾有多少個0?例如 n 5,n 120.末尾有1個0.n 10,n 3628800.末尾有2個0。分析 看到這個問題,有人可能第一反應是先求出n 然後再根據求出的結果,最後得出n 的末尾有多少個0。但是轉念一想,會不會溢位。其實,從 哪些數相乘可以得到10 這個角度,問題就...
C語言 101到200之間有多少個素數
判斷101 200之間有多少個素數,並輸出所有素數及素數的個數。程式分析 判斷素數的方法 用乙個數分別去除2到sqrt 這個數 如果能被整除,則表明此數不是素數,反之是素數。另一種思路 素數 大於1,並且除了1 和本身以外不能被其他數整除,這樣的數為素數 程式設計 i 1 i for j 2 j i...