【编程之美】2.4 1的数目

这道题其实是做过了的,在http://www.cnblogs.com/dplearning/p/3921535.html

但是再次做还是相当的糟糕。又看了一遍答案。

关键:要求每一位上1的个数, 其任意一位上1的个数受当前位、高位、低位三方面的影响。 注意这三位怎么求,注意数据类型。注意循环条件。

#include <stdio.h>

long long Sum1s(unsigned long long n)
{
    unsigned long long iCount = 0;
    unsigned long long iFactor = 1;

    unsigned long long iCurrent = 0;
    unsigned long long iHigher = 0;
    unsigned long long iLower = 0;

    while(n/iFactor != 0)
    {
        iHigher = n / (iFactor * 10);
        iLower = n % iFactor;
        iCurrent = (n / iFactor) % 10;

        switch(iCurrent)
        {
        case 0: iCount += iHigher * iFactor; break;
        case 1: iCount += iHigher * iFactor + iLower + 1; break;
        default: iCount += (iHigher + 1) * iFactor; break;
        }

        iFactor *= 10;
    }
    return iCount;
}

int main()
{
    long long num = Sum1s(123);
    return 0;
}

 扩展问题,如果数字不是10进制的如何:

很简单,把所有用到10的地方都换成需要的进制数就可以了。

long long Sum1sDifferentFactor(unsigned long long n, unsigned char factor)
{
    unsigned long long iCount = 0;
    unsigned long long iFactor = 1;

    unsigned long long iCurrent = 0;
    unsigned long long iHigher = 0;
    unsigned long long iLower = 0;

    while(n/iFactor != 0)
    {
        iCurrent = (n / iFactor) % factor;
        iHigher = n / (iFactor * factor);
        iLower = n % iFactor;

        switch(iCurrent)
        {
        case 0: iCount += iHigher * iFactor; break;
        case 1: iCount += iHigher * iFactor + iLower + 1; break;
        default: iCount += (iHigher + 1) * iFactor; break;
        }
        
        iFactor *= factor;
    }
    return iCount;
}

 

posted @ 2014-10-17 15:57  匡子语  阅读(406)  评论(1编辑  收藏  举报