编程之美-2.4 1的数目

计算1到N中1的个数
本文介绍了一种高效算法,用于计算从1到任意整数N中数字1出现的总次数,并通过C++代码实现了该算法。

一、问题描述

    给定一个十进制数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;
}

 

转载于:https://www.cnblogs.com/jfcspring/p/3774640.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值