POJ_1019,过程模拟问题,代码有所参考
#include <iostream>
using namespace std;
int c[52850],n[52850];
long long s[52850];
int length(int x){
int sum=0;
while (x != 0){
x /= 10;
sum++;
}
return sum;
}
void init(){
n[0] = c[0] = s[0] = 0;
for (int i = 1; i <= 52849; i++)
n[i] = length(i);
for (int i = 1; i <= 52849; i++)
c[i] = c[i - 1] + n[i];
for (int i = 1; i <= 52849; i++)
s[i] = s[i - 1] + c[i];
}
int main(){
init();
int Test,left,pos,num;
scanf("%d", &Test);
while(Test--){
scanf("%d", &num);
left = lower_bound(s + 1, s + 52845, num) - (s + 1);
pos = num - s[left]; //当前轮的第几个数字
left = lower_bound(c + 1, c + 52845, pos) - (c + 1);
pos = pos - c[left]; //当前数值的第几个数字
left++; //当前数字位于的数值
pos = n[left] - pos; //当前数字位于数字的第几位(从右至左数,0开始计数)
for(int i = 0;i < pos;i++)
left /= 10;
cout << left % 10<<endl;
}
return 0;
}