UVA Number Sequence(规律)

来源:互联网 发布:网络依赖症定义 编辑:程序博客网 时间:2024/05/17 02:45

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





0 0