編程之美2.4——計算1的個數

計算從1到整數N之間的全部整數,1出現的次數。記爲f(N).算法

好比12:1,10,11,12 1出現5次。spa

【思路】code

1.常規解法,先計算任意一個整數N中所含的1的個數,好比13含1個1,而後再套一個從1到N的循環,計算每一個數出現1的次數。blog

2.總結規律。it

f(N)=個位出現1的個數+十位出現1的個數+百位出現1的個數+.....class

eg:N=123;循環

個位出現1的次數與十位數的關係:總結

個位數字=0:十位數(的個數)di

個位數字>=1:十位數+1while

十位出現1的次數與個位數的關係:

十位數字=1:個位數+1

十位數字>1:(百位數+1)*10

總結:每位上出現1的次數會受到三個因素影響:該位上的數字、該位如下(低位)上的數字、該位以上(高位)上的數字。

【code in the book】

int count1inInteger(int n)
{
    int icount=0;
    int ilower=0;
    int icurr=0;
    int ihigher=0;
    int ifactor=1;
    while(n/ifactor!=0){
        ilower=n-(n/ifactor)*ifactor;
        icurr=(n/ifactor)%10;
        ihigher=n/(ifactor*10);
        switch(icurr){
        case 0:
            icount+=ihigher*ifactor;
            break;
        case 1:
            icount+=ihigher*ifactor+ilower+1;
            break;
        default:
            icount+=(ihigher+1)*ifactor;
            break;
        }
        ifactor*=10;
    }
    return icount;
}

【總結】

算法很棒,但規律難發現,更難整合到幾行代碼中。

相關文章
相關標籤/搜索