Problem B
Number Sequence
Input: standard input
Output: standard output
Time Limit: 1 second
A single positive integer iis given. Write a program to find the digit located in the position iin the sequence of number groups S1S2…Sk. Each groupSkconsists 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<iostream>
#include<algorithm>
#include<stdio.h>
#include<string.h>
#include<stdlib.h>
#include<ctype.h>
#include<math.h>
#include <limits.h>
using namespace std;
const int maxx = 100000;
char str[10000100];
long long int sum[1000010];
int k;
void findx()
{
k = sqrt(999999999);
//printf("k = %d\n",k);
int t = 0;
for(int i=1; i<=k; i++)
{
sprintf(&str[t], "%d", i);
while (isdigit(str[t]))
{
t++;
}
}
int cnt;
sum[0] = 0;
int ssum = 0;
for(int i=1;i<=k;i++)
{
cnt = 0;
int kk = i;
while(kk)
{
cnt++;
kk = kk / 10;
}
ssum += cnt;
sum[i] = sum[i-1];
sum[i] += ssum;
}
}
int main()
{
findx();
int n;
int T;
scanf("%d",&T);
while(T--)
{
scanf("%d",&n);
int low = 1;
int high = k;
int mid;
while(low < high)
{
mid = (low + high)/2;
if(sum[mid] >= n)
{
high = mid;
}
else
{
low = mid+1;
}
}
int pk = n - sum[low-1];
printf("%c\n",str[pk-1]);
}
return 0;
}