1. 程式人生 > >劍指offer-整數中1出現的次數(從1到n整數中1出現的次數)

劍指offer-整數中1出現的次數(從1到n整數中1出現的次數)

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 的個數時:

  1. 取第 i 位左邊(高位)的數字,乘以 10i?1,得到基礎值 a。
  2. 取第 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出現的次數)