1009 数字1的数量(思维)

给定一个十进制正整数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
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<

你可能感兴趣的:(1009 数字1的数量(思维))