编程之美-----1的数目

/*编程之美系列:*/

//01 一的数目:

#include<iostream>
using namespace std;
//暴力:
/*
int f(int n)
{
    int count=0;
    while(n)
    {
        if(n%10==1)
        {        count++;        }
        n/=10;
    }
    return count;
}
*/
//数学思想
/*
  假设N=abcde为一个整数,a,b,c,d,e分别对应十进制数,如果要计算(1到N)百位出现1的个数,他将受三个因素的影响:百位以上的数,百位数和百位一下的数,具体依赖如下:

  分别设整数N百位以上,百位和百位一下的数字分别为:preNum,curNum,proNum,如N=abcde的三个值分别为:

  preNum=ab

    curNum=c

    proNum=de

    分三种情况讨论百位上的数字出现1的计数(用oneCount表示)

    情况1:百位数字为0(curNum=0),oneCount=preNum*100;

    情况2:百位数字为1(curNum=1),oneCount=preNum*100+proNum+1;

    情况3:百位数字大于1(curNum>1),oneCount=(preNum+1)*100;

    其他位计算1出现的个数类似


 * 对于数abcde,c这位出现1的次数分以下情况:
 * 1.若c > 1,结论是(ab + 1)* 100;
 * 2.若c == 1,结论是(ab)* 100 + de + 1;
 * 3.若c < 1,结轮是 ab * 100 + de + 1;
*/
int f (int n)
{
    int count=0;
    int t=1;
    int pre,cur,aft;

    while(n/t)
    {
        pre=(n/t)/10;//当前数的高位部分
        cur=(n/t)%10;
        aft=n%t;//当前数的低位部分
        switch(cur){
            case(0):
                count+=pre*t;
                break;
            case(1):
                count+=pre*t+aft+1;
                break;
            default:
                count+=(pre+1)*t;
                break;
        }
        t*=10;
    }
    return count;
}

int main(){
    cout<<"请输入整数n:"<<endl;
    int n;
    cin>>n;
    cout<<f(n)<<endl;
    system("pause");
    return 0;
}
原文地址:https://www.cnblogs.com/tianjintou/p/4363908.html