输入一个整数n,求从1到n这n个整数的十进制表示中1出现的次数

题目:

输入一个整数n,求从1nn个整数的十进制表示中1出现的次数。

例如输入12,从112这些整数中包含1 的数字有11011121一共出现了5次。

 

分析:

可以一位一位考虑,对于10^b位:例如23456的百位

1)此位大于1,这一位上1的个数有 ([n / 10^(b+1) ] + 1) * 10^b 24*100:千位万位从023,百位的1会出现100次)

2)此位等于0,为 ([n / 10^(b+1) ] ) * 10^b(若百位为0,则千位万位从022

3)此位等于1,在0的基础上加上n mod 10^b + 1(同上,但百位的1出现了56次)

23456

b=02346

b=12350

b=22400

b=33000

b=410000

加起来,和为20096

#include <iostream>

using namespace std;

 

int num_of_1(int n)

{

    /*it should cover all powers of 10 within int range*/

    static int pows[] = {1, 10, 100, 1000, 10000, 100000, 1000000, 10000000, 100000000, 100000000};

    int b = 0, count = 0;

    while(n >= pows[b]){

        switch( (n % pows[b+1]) / pows[b]){

                case 0:

                    count += (n / pows[b + 1]) * pows[b];

                    break;

                case 1:

                    count += (n / pows[b + 1]) * pows[b];

                    count += n % pows[b] + 1;

                    break;

                default:

                    count += (n / pows[b + 1] + 1) * pows[b];

        }

        b++;

    }

    return count;

}

 

int main()

{

    cout << num_of_1(23456) << endl;

    return 0;

}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值