好奇的薯队长(1到n,1的个数)

时间限制:1秒

空间限制:32768K

薯队长在平时工作中需要经常跟数字打交道,某一天薯队长收到了一个满是数字的表格,薯队长注意到这些数字里边很多数字都包含1,比如101里边包含两个1,616里包含一个1。

请你设计一个程序帮薯队长计算任意一个正整数n(0<n<=2147483647),从1到n(包括n)的所有整数数字里含有多少个1。

 

输入描述:

正整数n(0<n<=2147483647)

 

输出描述:

从1到n(包括n)的所有整数数字里含有多少个1

 

输入例子1:

1

 

输出例子1:

1

 

输入例子2:

13

 

输出例子2:

6

 

例子说明2:

从1到13(包括13)有13个数字,其中包含1的数字有1,10,11,12,13,这些数字里分别有1,1,2,1,1个1,所以从1到13(包括13)的整数数字中一共有1+1+2+1+1=6个1
#include<iostream>
#include<cstring>
#include<cmath>
using namespace std;
typedef long long ll;
int main()
{
    ll n;
    cin>>n;
    ll t = n;
    ll ans = 0;
    ll b = 0;
    while(t>0)
    {
        ll s = t%10;
        ll m1 = pow(10,b+1);
        ll m2 = pow(10,b);
        if(s == 0)
        {
            ans += n / m1 * m2;
        }else if(s == 1)
        {
            ans += n / m1 * m2 + n % m2 + 1;
        }else
        {
            ans += (n/m1+1 )*m2;
        }
        b++;
        t/=10;
    }
    cout<<ans<<endl;


    return 0;
}
///当前位大于1, 该位上1的个数有: [n/ 10^(b+1) + 1 ] * 10^b
///当前位等于0, 该位上1的个数有: [n/ 10^(b+1) ] * 10^b
///当前位等于1, 该位上1的个数有: [n/ 10^(b+1) ] * 10^b + n%10^b + 1
///个位为第0位

 

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值