Description
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
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<cstring>
using namespace std;
int weishu(int a)
{
int m=0;
while(a)
{
m++;
a=a/10;
}
return m;
}
bool check(__int64 hangshu[],int hang,__int64 num)
{
__int64 sum=0;
for(int i=1;i<=hang;i++)
sum+=hangshu[i];
if(sum<0)
return true;
if(sum<num)
return false;
return true;
}
int main()
{
char m[400000];
memset(m,'0',sizeof(m));
int k=1;
for(int i=1;;i++)
{
int c=i;
int w=weishu(c);
while(c)
{
m[k+(--w)]+=c%10;
c=c/10;
}
k+=weishu(i);
if(k>=390000)
break;
}
__int64 hangshu[31270];
memset(hangshu,0,sizeof(hangshu));
for(__int64 i=1;i<31270;i++)
{
if(i>=1&&i<=9)
hangshu[i]=i;
else
if(i>=10&&i<=99)
hangshu[i]=9+(i-9)*2;
else
if(i>=100&&i<=999)
hangshu[i]=189+3*(i-99);
else
if(i>=1000&&i<=9999)
hangshu[i]=2889+(i-999)*4;
else
if(i>=10000&&i<=99999)
hangshu[i]=38889+(i-9999)*5;
}
int t;
cin>>t;
while(t--)
{
__int64 a;
cin>>a;
__int64 hang;
__int64 left=1;
__int64 right=31268;
while(left<right)
{
__int64 mid=(left+right)>>1;
if(check(hangshu,mid,a))
{
right=mid;
}
else
left=mid+1;
}
for(int i=1;i<left;i++)
a-=hangshu[i];
cout<<m[a]<<endl;
}
}
/*
50
523525432
*/
应学会缩小左右边界,剪枝。