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
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
思路:
一排排的算吧。。好像也确实没啥好的办法。当加的数字的位数大于等于两位的时候要用到log10(doublen)+1的公式来计算位数
#include<stdio.h>
#include<math.h>
typedef long long ll;
const int maxn = 65540;
ll a[maxn], b[maxn];
void reset()
{
int i;
a[1] = 1;
b[1] = 1;
for (i = 2; i <= 65537; ++i) //可以先大致估算一下要几排
{
a[i] = a[i - 1] + log10((double)i) + 1;
b[i] = b[i - 1] + a[i];
}
}
int main()
{
reset();
int t, i, m;
ll pos, tmp;
ll x;
scanf("%d",&t);
while (t--)
{
scanf("%lld",&x);
for (i = 1; b[i] < x; ++i)
{
continue;
}
pos = x - b[i - 1];
tmp = 0;
for (m = 1; tmp < pos; m++)
{
tmp += (ll)log10((double)m) + 1;
}
m--;
ll k = tmp - pos;
m = m / (int)pow(10.0, k);
m = m % 10;
printf("%d\n",m);
}
return 0;
}
//65537