可以看成是1,12,123,1234,12345,。。。这样组合而成,所以每增加一项,第i项增加的位数为log10(i)+1
首先确定对给定的n,它属于上面的第几项?再确定它是这一项中哪一个数字的第几项。
#include <iostream>
#include <cstdio>
#include <cstdlib>
#include <cstring>
#include <algorithm>
#include <vector>
#include <map>
#include <cmath>
#include <set>
#include <queue>
using namespace std;
const int INF=1e9+10;
typedef long long ll;
ll a[40005];
ll sum[40005];
int main(){
int len;
for(int i=1;;i++){
a[i]=a[i-1]+(ll)log10(i)+1;
sum[i]=1LL*sum[i-1]+a[i];
if(sum[i]>2147483647){
len=i;
break;
}
}
int t;
scanf("%d",&t);
while(t--){
int n;
scanf("%d",&n);
int pos=lower_bound(sum+1,sum+len+1,n)-sum-1;
n-=sum[pos];
pos=lower_bound(a+1,a+len+1,n)-a;
n-=a[pos-1];
int bit[100],cnt=0;
while(pos){
bit[cnt++]=pos%10;
pos/=10;
}
reverse(bit,bit+cnt);
printf("%d\n",bit[n-1]);
}
return 0;
}