10706 - Number Sequence
Time limit: 3.000 secondsA single positive integer i is given. Write a program to find the digit located in the position i in the sequence of number groupsS1S2…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 <=25), 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 Output for Sample Input
2 8 3 | 2 2 |
Problem source: Iranian Contest
Special Thanks: Shahriar Manzoor, EPS.
#include<stdio.h>
#include<string.h>
#include<ctype.h>
#include<math.h>
#define MAX 2147483647
using namespace std;
int K;
long long int sum[100000];
char b[1000000];
int pan(int x) {
int n = 0;
while(x) {
x /= 10;
n ++;
}
return n;
}
void init() {
int i,j,a;
K = sqrt(MAX) + 1;
j=1;
for(i=1; i<=K; i++) {
sprintf(&b[j],"%d",i);
while(isdigit(b[j]))
j++;
}
a=sum[0]=0;
for(i=1;i<=K;i++) {
a+=pan(i);
sum[i]=sum[i-1];
sum[i]+=a;
}
}
int main() {
int k,num,t,min,mid,max;
init();
scanf("%d",&t);
while(t--) {
scanf("%d",&num);
min=0;
max=K;
while(1) {
mid=(min+max)/2;
if(mid==min)
break;
if(sum[mid]>=num)
max=mid;
else
min=mid;
}
k=num-sum[mid];
printf("%c\n",b[k]);
}
return 0;
}