编程之美-2.4 1的数目

一、问题描述

    给定一个十进制数N,写下从1开始,到N的所有整数,然后数一下之中所有“1”的个数。

  例如:

    N=12,(1,2,3,4,5,6,7,8,9,10,11,12)共有5个1

二、解题思想

  假设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出现的个数类似

三、代码实现

#include<iostream>
using namespace std;
int compOneNum(int n){
    int preNum;
    int curNum;
    int proNum;
    int oneCount=0;
    //当前位的幂指数10^a
    int t=1;
    while(n/t){
        preNum=n%t;
        curNum=(n/t)%10;
        proNum=(n/t)/10;
        switch (curNum){
        case 0:
            oneCount+=proNum*t;
            break;
        case 1:
            oneCount+=proNum*t+preNum+1;
            break;
        default:
            oneCount+=(proNum+1)*t;
            break;
        }
        t=t*10;
    }
    return oneCount;
}
int main(){
    cout<<"请输入整数n:"<<endl;
    int n;
    cin>>n;
    int oneCount=compOneNum(n);
    cout<<oneCount<<endl;
    system("pause");
    return 0;
}

 

posted on 2014-06-07 12:57  jfcspring  阅读(869)  评论(1编辑  收藏  举报

导航