//============================================================================
// Name : 1019.cpp
// Author :
// Version :
// Copyright : Your copyright notice
// Description : Hello World in C++, Ansi-style
//============================================================================
#include <iostream>
#include <sstream>
using namespace std;
#define M 2147483647
#define N 31269
typedef unsigned int uint;
uint len[N];
uint start[N];
uint end[N];
int size(int i) {
if (i > 9999)
return 5;
if (i > 999)
return 4;
if (i > 99)
return 3;
if (i > 9)
return 2;
return 1;
}
int findIndex(int st, int en, uint value) {
if (st == en - 1) {
return st;
}
int mid = (st + en) / 2;
if (value < start[mid]) {
return findIndex(st, mid, value);
} else if (value >= end[mid]) {
return findIndex(mid + 1, en, value);
} else {
return mid;
}
}
int findLength(int st, int en, int value) {
if (st == en - 1) {
return st;
}
int mid = (st + en) / 2;
if (value < len[mid]) {
return findLength(st, mid, value);
} else if (value >= len[mid + 1]) {
return findLength(mid + 1, en, value);
} else {
return mid;
}
}
char getChar(int num, int ch) {
stringstream out;
out << num;
string str = out.str();
return str[ch];
}
int main() {
len[0] = 0;
start[0] = 0;
end[0] = 1;
for (int i = 1; i < N; i++) {
len[i] = len[i - 1] + size(i);
start[i] = end[i - 1];
end[i] = start[i] + len[i];
}
int t;
cin >> t;
while (t--) {
uint number;
cin >> number;
int index = findIndex(1, N, number);
int left = number - start[index];
int lenindex = findLength(0, N, left);
int realNumber = lenindex + 1;
int ch = left -len[lenindex];
char result = getChar(realNumber, ch);
cout << result<<endl;
}
return 0;
}
poj1019
最新推荐文章于 2019-04-10 22:17:00 发布