UVaOJ10706 - Number Sequence

来源:互联网 发布:做淘宝联盟赚钱吗 编辑:程序博客网 时间:2024/06/05 12:40

10706 - Number Sequence

Time limit: 3.000 seconds

A 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 2147483647using 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;}


原创粉丝点击