题目描述
一天,小R准备找小h去游泳,当他找到小h时,发现小h正在痛苦地写着一列数,1,2,3,…n,于是就问小h痛苦的原因,小h告诉他,现在他要算1…n这些数里面,1出现的次数是多少,如n=11的时候,有1,10,11共出现4次1,现在给出n,你能快速给出答案么?
输入
一行,一个整数n
输出
一个整数,表示1…n中1出现的次数。
输入样例
11
输出样例
4
说明
对于30%的数据:n<=1000;
对于100%的数据:n<=maxlongint;
解
推,找规律。
代码
#include<cstdio>
long long n,ans,k1,k2,k3;
int main(){
scanf("%lld",&n);
ans = (n + 9) / 10;
for(long long i = 10; i <= n; i *= 10){ //枚举当前位
k1 = n/(i*10); //当前位置前面的数
k2 = n/i % 10; //当前位
k3 = n % i; //后面的
ans += k1 * i;
if(k2 > 1) ans += i;
if(k2 == 1) ans += k3+1;
}
printf("%lld",ans);
}