Number Sequence
Time Limit: 1000MS | Memory Limit: 10000K | |
Total Submissions: 37890 | Accepted: 10952 |
Description
A single positive integer i is given. Write a program to find the digit located in the position i in the sequence of number groups S1S2...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
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 ≤ 10), 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
2 8 3
Sample Output
2 2
a[] b[]
1
1
1
12
2
3
123
3
6
1234
4
10
12345
5
15
.....
求第i位是什么
#include<iostream>
#include<stdio.h>
#include<string.h>
#include<queue>
#include<vector>
#include<math.h>
using namespace std;
const int MAX = 32000;
unsigned a[MAX], b[MAX];
void creat()
{
a[1] = b[1] = 1;
for(int i = 2; i<MAX;++i)
{
a[i] = a[i-1]+(int)log10((double)i)+1;
b[i] = b[i-1]+a[i];
}
}
int f(int x)
{
int i = 1;
while(b[i]<x)++i;
int pos = x-b[i-1];
int len = 0;
for(i = 1; len<pos; ++i)
{
len+=(int)log10((double)i)+1;
}
return (i-1)/(int)pow((double)10, len-pos)%10;
}
int main()
{
creat();
int t, x;
scanf("%d", &t);
while(t--)
{
scanf("%d", &x);
printf("%d\n", f(x));
}
return 0;
}