摘要:打表记录以断为单位的位数。
#include <iostream>
#include <climits>
#include <iomanip>
#include <cassert>
using namespace std;
unsigned int table[31270] = {0};
int calLen(int i)
{
if( i>= 1000000000 ){
return 10;
}
if( i>= 100000000 ){
return 9;
}
if( i>= 10000000 ){
return 8;
}
if( i>= 1000000 ){
return 7;
}
if( i>= 100000 ){
return 6;
}
if( i>= 10000 ){
return 5;
}
if( i>= 1000 ){
return 4;
}
if( i>= 100 ){
return 3;
}
if( i>= 10 ){
return 2;
}
return 1;
}
int main()
{
int seg = 1;
unsigned int seg_len = 0;
while( true ){
int len = calLen(seg);
seg_len += len;
table[seg] = table[seg-1] + seg_len;
if( table[seg] > INT_MAX ){
break;
}
seg = seg+1;
}
int n;
cin >> n;
for(int i=1; i<=n; i++){
int pos;
cin >> pos;
int index = 1;
while( table[index] < pos ){
index++;
}
pos = pos - table[index-1];
int num = 1;
int len = 0;
while( len + calLen(num) < pos ){
len = len+calLen(num);
num++;
}
pos = pos - len;
assert(pos <= 10);
char buf[11];
sprintf(buf, "%d", num);
cout << buf[pos-1] << endl;
}
return 0;
}