编程之美2.4——计算1的个数

计算从1到整数N之间的所有整数,1出现的次数。记为f(N).

比如12:1,10,11,12 1出现5次。

【思路】

1.常规解法,先计算任意一个整数N中所含的1的个数,比如13含1个1,然后再套一个从1到N的循环,计算每个数出现1的次数。

2.总结规律。

f(N)=个位出现1的个数+十位出现1的个数+百位出现1的个数+.....

eg:N=123;

个位出现1的次数与十位数的关系:

个位数字=0:十位数(的个数)

个位数字>=1:十位数+1

十位出现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;
}

【总结】

算法很棒,但规律难发现,更难整合到几行代码中。

原文地址:https://www.cnblogs.com/ketchups-notes/p/4503556.html