牛客真题练习——(一)

链接:https://www.nowcoder.com/questionTerminal/12b157cfc4ea4a2bacae85d5e177c13c
来源:牛客网

[编程题]好奇的薯队长

薯队长在平时工作中需要经常跟数字打交道,某一天薯队长收到了一个满是数字的表格,薯队长注意到这些数字里边很多数字都包含1,比如101里边包含两个1,616里包含一个1。
请你设计一个程序帮薯队长计算任意一个正整数n(0<n<=2147483647),从1到n(包括n)的所有整数数字里含有多少个1。

输入描述:
正整数n(0<n<=2147483647)

输出描述:
从1到n(包括n)的所有整数数字里含有多少个1

示例1
输入
1
输出
1
示例2
输入
13
输出
6
说明
从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

思路:
分别从各个位的角度来考虑这个题
(1).个位:
个位的增长规律是0~9循环,找出来round(表示循环0-9的轮数)即可。如果n的个位数是0,即为round;反之,round+1。
(2).十位
十位的增长规律也是0~9循环,只是每次增加十个数.
假设十位数字大于1,比如n=524,sum=(52 * 1+1)+(5 * 10+10)+(100 * 1)
即sum+=round * base+base
假设十位数字等于1,比如n=514,sum=(51 * 1+1)+(5 * 10+4+1)+(100 * 1)
即sum+=round * base+former+1,former即n%base剩下的个数
假设十位数字等于0,比如n=504,sum=(50 * 1+1)+(5 * 10)+(100 * 1)
即sum+=round * base。

代码:

#include<cstdio>
#include<iostream>
#include<cmath>
#include<algorithm>
#include<cstring>
using namespace std;
const int maxn = 1e3+20;
#define ll long long

int main(){
    ll n;
    scanf("%lld",&n);
    ll round,base=10;
    ll sum=0;
    sum = n / 10;
    if(n % 10 > 0)
        sum++;
    round = n /10;

    while(round){
        int tmp = round % 10;
        round = round / 10;
        if(tmp == 0){
            sum += base * round;
        }
        else if(tmp == 1){
            sum += base * round + (n%base+1);
        }
        else
            sum += base * (round+1);
        base *= 10;
    }
    printf("%lld\n",sum);
    return 0;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值