劍指offer-整數中1出現的次數(從1到n整數中1出現的次數)
阿新 • • 發佈:2018-04-21
cme 劍指offer int gin num count pan acmer n)
題目描述
求出1~13的整數中1出現的次數,並算出100~1300的整數中1出現的次數?為此他特別數了一下1~13中包含1的數字有1、10、11、12、13因此共出現6次,但是對於後面問題他就沒轍了。ACMer希望你們幫幫他,並把問題更加普遍化,可以很快的求出任意非負整數區間中1出現的次數。解題思路
考慮從個位開始計算1出現的次數,個位上每10個數就會出現一個1,所以計算十位數之後出現1的次數即n模10的余數為a。假如個位數為0,那麽a就為個位上1出現的次數;若等於1,那麽還應該再加上1,也就是個位數為1所有數字的個數;若大於1,則a應該再加上1,即十位數出現的次數為a+1.同樣的思想依次向左考慮十位數、百位數一直到最高位。
總結一下以上的算法,可以看到,當計算右數第 i 位包含的 1 的個數時:
- 取第 i 位左邊(高位)的數字,乘以 10i?1,得到基礎值 a。
- 取第 i 位數字,計算修正值:
- 如果大於 1,則結果為 a+10i?1。
- 如果小於 1,則結果為 a。
- 如果等於 1,則取第 i 位右邊(低位)數字,設為 b,最後結果為 a+b+1。
代碼
1 class Solution { 2 public: 3 int NumberOf1Between1AndN_Solution(int n) 4 { 5 int count = 0; 6 for(int i = 1; i <= n; i *= 10) { 7 int a = n / i,b = n % i; 8 count += (a + 8) / 10 * i + ((a % 10 == 1) ? b + 1 : 0); 9 } 10 return count; 11 } 12 };
劍指offer-整數中1出現的次數(從1到n整數中1出現的次數)