#include <iostream>
#include <stdio.h>
using namespace std;
int D[100001];
int get_digit(int k) //k占用几位
{
if(D[k] != 0)
return D[k];
int tk=0;
while(k>0)
{
tk++;
k /= 10;
}
D[k] = tk;
return D[k];
}
int get_in_k(int k,int M)//在Dk寻找第M个位置的数字
{
int i=1;
//printf("init k=%d M=%d\n",k,M);
while(M> get_digit(i))
{
M -= get_digit(i);
i++;
}
int l = get_digit(i) +1 - M; //M是从左边,即高位在i中寻找第M个数字。 l是从右边即低位寻找第M个数组
//printf("k=%d M=%d l=%d i=%d\n",k,M,l,i);
while( l > 1)
{
i /= 10;
l--;
}
return i%10;
}
int solve(int M)
{
int k=1;
int l=1;
while( M > l)
{
M -= l; //l是Sk占用的位数,SK占用的位数是SK-1占用位置 +k占用的位数
//l++;
k++;
l += get_digit(k);
}
return get_in_k(k,M);
}
int main(){
int n;
cin>>n;
for(int i=1;i<=n;i++)
{
int M;
cin>>M;
cout<<solve(M)<<endl;
}
}
poj 1019 Number Sequence
最新推荐文章于 2013-09-17 10:33:42 发布