A single positive integer i is given. Write a program to find the digit located in the position i in the sequence of number groups S1S2...Sk. Each group Sk consists of a sequence of positive integer numbers ranging from 1 to k, written one after another.
For example, the first 80 digits of the sequence are as follows:
11212312341234512345612345671234567812345678912345678910123456789101112345678910
Input
The first line of the input file contains a single integer t (1 ≤ t ≤ 10), the number of test cases, followed by one line for each test case. The line for a test case contains the single integer i (1 ≤ i ≤ 2147483647)
Output
There should be one output line per test case containing the digit located in the position i.
Sample Input
2
8
3
Sample Output
2
2
#include<iostream>
#include<algorithm>
#include<cstdio>
#define LL long long
using namespace std;
const int maxn= 50001;
const LL UP = 2.2e9;
LL num[maxn], sum[maxn];
int cnt,xin[15];
inline void init()
{
LL up = 0, pre = 0, x = 0, cut = 0; cnt = 0;
int flag = 0;
for(int k = 1; k <= 9; ++k)
{
cut = x;
x = x*10+9;
LL xx = x-cut;
for(int i = 1; i <= xx; ++i)
{
up += pre+i*k;
num[++cnt] = pre+i*k;
if(up >= UP){flag = 1; break;}
}
if(flag) break;
pre += (x-x/10)*k;
}
sum[0] = 0; sum[1] = num[1];
for(int i = 1; i <= cnt; ++i) sum[i] = sum[i-1]+num[i];
}
int main()
{
init();
int t, n, k, flag;
scanf("%d", &t);
while(t--)
{
cin>>n;
for(k = 1; k <= cnt; ++k)
if(n <= sum[k]) break;
n -= sum[k-1]; flag = 0;
for(int i = 1; i <= k; ++i)
{
int t = i, j = 0;
while(t)
{
xin[++j] = t%10;
t /= 10;
}
for(int l = j; l >= 1; --l)
{
--n;
if(n == 0)
{
flag = 1;
cout<<xin[l]<<endl;
break;
}
}
if(flag) break;
}
}
return 0;
}
题解:大字串是1 12 123 1234 12345……所以可以先把大字串分成小字串,再寻找具体位置上是几。