二分注意边界问题,因为0也是可以取得到的!!左边界最好设置为0!!(虽然我没有)
#include <bits/stdc++.h>
using namespace std;
#define int long long
const int maxn=1e5+10;
int q,k,a[maxn],b[maxn],c[maxn],last[maxn];
int isok(int mid,int k)
{
//数字mid的第k位
int w[6],top=0;
while( mid )
{
w[++top]=mid%10;
mid/=10;
}
if( k<0 )
{
while(1) cout << "NO!";
}
return w[top-k+1];
}
signed main()
{
for(int i=1;i<=100000;i++)
{
int num=0,x=i;
while( x )
{
num++;
x/=10;
}
a[i]=num,b[i]=b[i-1]+a[i],c[i]=c[i-1]+b[i];
}
cin >> q;
for(int i=1;i<=q;i++)
{
cin >> k;
int l=1,r=1e5,mid,now=0;
while( r>=l )
{
mid=l+r>>1;
if( c[mid]<k ) l=mid+1,now=mid;
else r=mid-1;
}
k-=c[now];//现在还剩了k个数字
l=1,r=1e5,now=0;
while( r>=l )
{
mid=l+r>>1;
if( b[mid]<k ) l=mid+1,now=mid;
else r=mid-1;
}
k-=b[now];
cout << isok(now+1,k) << endl;
}
}