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;
}