链接: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;
}