给定一个十进制正整数N,写下从1开始,到N的所有正数,计算出其中出现所有1的个数。
例如:n = 12,包含了5个1。1,10,12共包含3个1,11包含2个1,总共5个1。
输入
输入N(1 <= N <= 10^9)
输出
输出包含1的个数
输入样例
12
输出样例
5
一个多位数21905:
个位:它出现1的数为:1 ~ 21901,一共 2190 - 0 + 1 = 2191
十位:它出现1的数为:1x ~ 2181x (x 从0到9)一共:(218 - 0 + 1)10 = 2190
百位:它出现1的数为:1xx ~ 211xx ,一共:(21 - 0 + 1) 100 = 2200
千位:它出现1的数为:1xxx ~ 11xxx 和 21000 ~ 21905 ,一共:(1 - 0 + 1)*1000 + (905 - 0 + 1)= 2000 + 906 = 2906
万位:它出现1的数为:1xxxx ~ 1xxxx,一共:10000
如果当前位是0或者大于1时,那么当前结果只与高位有关,如果是1的话,那么还要把低位的也考虑进去。
#include<bits/stdc++.h>
using namespace std;
#define ll long long
int main()
{
ios::sync_with_stdio(false);
int n,t=1,sum=0,tmp;
cin>>n;
tmp=n;
while(n)
{
if(n%10==0) sum+=(n/10-1+1)*t;
else if(n%10>1) sum+=(n/10+1)*t;
else sum+=(n/10-1+1)*t+(tmp-n*t+1);
t*=10;
n/=10;
}
cout<<sum;
return 0;
}