【劍指offer-解題系列(32)】整數區間中出現1的個數

題目描述

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

分析

較爲複雜的分析:

對於一個數字,如55342

1、對於個位,由於是十進制,所以每10個數出現一個1,那麼總共多少個10呢,就是5534個10,

也就是十位數之前的數字,而2大於等於1,所以還要加上1.

2、對於十位,每100個數中會出現10個1,(10,11,12,13...),總共553個100,而如果十位數大於1那麼就是553*10個1,  

.......                   

    

對於個位:假設個位數是number(2),個位數之前截取結果爲weight(5534),1的總數爲res

                        如果number>=1,res = weight+1,

否則,res=weight

對於十位:假設十位數是number(3),十位數之前截取結果爲weight(553),1的總數爲res,十位數之後的截取結果爲former (4)

                        如果number>1,res = weight*10,
                        如果number==1,res =(weight)*10+former+1
                        如果number<1,res = (weight)*10,


對於百位:假設百位數是number(5),十位數之前截取結果爲weight(5),1的總數爲res,十位數之後的截取結果爲former(34)

                        如果number>1,res = weight*100,
                        如果number==1,res =(weight)*100+former+1
                        如果number<1,res = (weight)*100,

.。。。。。。



代碼實現

               
int NumberOf1Between1AndN_Solution(int n)
{
    int former=0,weight=0,number=0;
    int res = 0;
    int base = 1;
    while(n!=0){
        number = n%10; 
        weight = n/10;
        
        if(base == 1){
            if(number>=1)
                res += weight+1;
            else
                res += weight;
        }
        else{
            if(number>1)
                res += (weight+1)*base;
            if(number==1)
                res += (weight)*base+former+1;
            if(number<1)
                res += (weight)*base;
        }
        former+=number*base;
        base*=10;
        n=n/10; 
    }
    return res;
}
                      
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章