題目描述:
輸入乙個整數n,求從1到n這n個整數的十進位制表示中1出現的次數
示例:
輸入12,則包含1的數字有1, 10 ,11 ,12,1共出現5次
輸出5
分析:
1. 當從1開始向n遍歷每個整數,對每個整數的每一位進行判斷時,效率非常低。
2. 首先分析1346到21345中1出現的次數。可以分為兩種情況:
1)高位為1。其中又包含1只出現在高位,和其它低4位也包含1的情況
2)高位不是1
3. 另一種更簡單的方法,分析數字的規律
假設n為乙個4位數abcd,以十位上為例進行分析:
當c=0時,n=ab0d,則可能的情況有高位為0~(ab-1)、個位為0~9,即總共可能的情況有(ab*10)種;
當c=1時,則還要在ab *10的基礎上加上ab10~ab1d這(d+1)種情況,即共有ab *10 + (d+1)種。
當c>1時,則可能的情況為高位為0~ab、個位為0~9,共(ab+1) *10種情況。
以此類推,百位為1的情況有:
a*100 (b=0)
a*100 +(cd+1) (b=1)
(a+1)*100 (b>1)
總結:
設m=1 ,10 ,100 ,……,
a=n/m,b=n%m,
則m位包含1的個數為 :
(a/10)*m (a%10 =0 )
(a/10)*m + (b+1) (a%10 =1)
(a/10 + 1)* m (a%10 > 1)
最後可歸納為:((a+8)/10) * m + (a%10==1?(b+1):0)
(a+8)/10用於判斷乘以m時是否需要加1
**:
int countdigitone(int n)
return ones;
}
《劍指offer》系列 1
最近一直在看劍指offer,這上面的題目都是比較考察程式設計能力的,打算做個記錄,把寫過的 儲存下來 1.實現乙個string類 面試官的考察點應該在以下幾點 1.模板類的書寫 2.對於賦值函式考察的幾點 1 是否返回引用,因為只有返回引用,才能連續的進行賦值 2 引數是否是常量 3 是否是自身賦值...
劍指offer 列印從1到最大的n位數
輸入數字n,按順序列印出從1最大的n位十進位制數。比如輸入3,則列印出1 2 3一直到最大的3位數即999。因為題目沒有說明數在什麼範圍內,所以這是乙個大數問題,模擬加一或者用全排列來做 解法一 void print1tomaxofndigits int n bool addone int numb...
劍指offer列印從1到最大的n位數
輸入數字 n,按順序列印出從 1 到最大的 n 位十進位制數。比如輸入 3,則列印出 1 2 3 一直到最大的 3 位數 999d1,double d2 注意強制轉換為int int count int math.pow 10,n class solution return ans 觀察可知,生成的...