编程之美6:十进制 1到N,之间出现1的个数

1:
ULONGLONG Count1InAInteger(ULONGLONG n)
{
    ULONGLONG iNum = 0;
    while (n != 0)
    {
        iNum += (n % 10 == 1) ? 1 : 0;
        n /= 10;
    }
    return iNum;
}

ULONGLONG f(ULONGLONG n)
{
    ULONGLONG iCount = 0;
    for (ULONGLONG i = 1; i <= n; i++)
    {
        iCount += Count1InAInteger(i);
    }
    return iCount;
}

2:找规律:只需要分析N就可以得到f(N),避开了从1到N的遍历
LONGLONG Sum1s(ULONGLONG n)
{
    ULONGLONG iCount = 0;
    ULONGLONG iFactor = 1;
    ULONGLONG iLowerNum = 0;
    ULONGLONG iCurrNum = 0;
    ULONGLONG iHigherNum = 0;

    while (n / iFactor != 0)
    {
        iLowerNum = n - (n / iFactor) * iFactor;
        iCurrNum = (n / iFactor) % 10;
        iHigherNum = n / (iFactor * 10);

        switch (iCurrNum)
        {
        case 0:
            iCount += iHigherNum * iFactor;
            break;
        case 1:
            iCount += iHigherNum * iFactor + iLowerNum + 1;
            break;
        default:
            iCount += (iHigherNum + 1) * iFactor;
            break;
        }
        iFactor *= 10;
    }
    return iCount;
}

原创:https://blog.csdn.net/ndzjx/article/details/84404471

猜你喜欢

转载自blog.csdn.net/ndzjx/article/details/84404471
今日推荐