返回目录
题意
给出一个数字n,计算1-n的所有数字里面1出现的个数
样例(可复制)
12
样例输出
5
注意点
- 本题需要找规律,如果枚举每个数肯定会超时
- 假设一个数为10086,设个位数为第1位,万位为第5位,则找出的规律如下
- 第1位=1008+1,加1的原因是因为6>1
- 第2位=(100+1)*10,加1的原因是因为8>1
- 第3位=(10+0)*100+0,两个地方加0的原因是因为0<1
- 第4位=(1+0)*1000+0,两个地方加0的原因是因为0<1
- 第5位=(0+0)*10000+87,加87的原因是因为10086-10000+1=87
- 所以总共是4106=1009+1010+1000+1000+87
#include<bits/stdc++.h>
using namespace std;
int main(){
int n,a=1,ans=0;
int left,now,right;
cin>>n;
while(n/a!=0){
left=n/(a*10);
now=n/a%10;
right=n%a;
if(now==0)ans+=left*a;
else if(now==1)ans+=left*a+right+1;
else ans+=(left+1)*a;
a*=10;
}
cout<<ans;
return 0;
}