统计1的个数

#include <iostream>
#include <string>
using namespace std;

/************************************************************************/
/* 输入一个数字N,计算从1到N 这N个数字中1出现的次数
例如
N = 2,   则1 2中1出现的次数为1
N = 12, 则 1 2 3 4 5 6 7 8 9 10 11 12 中1出现的次数为5。
求任意给一个N返回1的个数。
1、暴力解法,从1遍历到N,求出每一个数字中1的个数,然后相加之和即为总共1的个数。
2、分析:分析每一位出现1的次数,总和即为总共1出现的次数

1位数时,N>=1, f(N)=1 当N<1 ,f(N)=0;
2位数时,假设ab为一个二位数;
分析个位b:个位1的个数为 a
分析十位a:十位1的个数,若a=1, 十位1的个数为b+1,若a>1,则十位1的个数为10


*/
/************************************************************************/
/*
输入一个整数N,求1 2 3 。。。N中含有1的个数
*/
int countOnes(int N)
{
    int iCount = 0;
    int iFactor = 1;
    int iLowerNum = 0;
    int iCurrNum = 0;
    int iHigherNum = 0;
    while(N/iFactor)
    {
        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;
}

int main(int argc, char **argv)
{
    int N;
    cin>>N;
    cout<<countOnes(N)<<endl;

    return 0;
}

 

posted on 2014-09-02 19:38  NewPanderKing  阅读(532)  评论(0编辑  收藏  举报

导航