【数论】简单游戏(easygame)

题目描述

一天,小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
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);
} 

你可能感兴趣的:(数论)