從1到n整數中1出現的次數

求出1~13的整數中1出現的次數,並算出100~1300的整數中1出現的次數?爲此他特別數了一下1~13中包含1的數字有1、10、11、12、13因此共出現6次,但是對於後面問題他就沒轍了。ACMer希望你們幫幫他,並把問題更加普遍化,可以很快的求出任意非負整數區間中1出現的次數。

參考別人的結題思路:

總的次數 = 個位是1的整數個數 + 十位是1的整數個數 + 百位是1的整數個數。。。。

下面以求百位是1的整數個數爲例推導出通用的計算公式:

首先對n進行分割,分爲兩部分,高位 a = n/100,低位 b = n%100.

當整數n的百位>=2,比如 n = 31456, 則 a = 314, b = 56,此時百位是1(即爲**1**)的次數有(a/10+1)*100個。

當整數n的百位爲1,比如 n = 31156, 則 a = 311, b = 56,此時百位是1的次數有(a/10)*100+(b+1)個。

當整數n的百位爲0,比如 n = 31056, 則 a = 310, b = 56,此時百位是1的次數有(a/10)*100個。

綜合以上三種情況,當百位爲0或者>=2時,有(a+8)/10*100個,當百位爲1時還需要加額外的b+1個。

之所以補8,因爲在百位>=2時就會產生進位,效果等同於(a/10+1)

class Solution {
public:
    int NumberOf1Between1AndN_Solution(int n)
    {
    	int count = 0;
        for(int i=1;i<=n;i = i*10)
        {
            int a = n/i;
            int b = n%i;
            count += (a+8)/10*i+(a%10==1)*(b+1);    
        }
        return count;
    }
};



發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章