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


 

題目描述

 
求出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 };

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM