Number Sequence
Time Limit: 1000MS | Memory Limit: 10000K | |
Total Submissions: 38481 | Accepted: 11166 |
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
很好玩的一道题,小小的考验了下思维。
事实证明,多刷题的确锻炼了我的思维,这题被我轻推了,放在以前肯定费翻功夫了。
我的代码向来简洁,就不多解释了。
#include <iostream>
#include <cstdio>
#include <cstring>
#include <algorithm>
using namespace std;
typedef long long LL;
const int MAXN = 6.36e4;
LL group[MAXN] = {0, 1};
LL cnt[MAXN] = {0, 1};
char str[MAXN * 5];
int main() {
#ifndef ONLINE_JUDGE
freopen("in.txt", "r", stdin);
#endif
for (int i = 2; i < MAXN; ++i) {
sprintf(str, "%d", i);
cnt[i] = cnt[i - 1] + strlen(str);
group[i] = group[i - 1] + cnt[i];
}
int t, n;
scanf("%d", &t);
while (t--) {
scanf("%d", &n);
int loc1 = lower_bound(group, group + MAXN, n) - group - 1;
int res1 = n - group[loc1];
int loc2 = lower_bound(cnt, cnt + MAXN, res1) - cnt - 1;
int res2 = res1 - cnt[loc2];
if (res2 == 0) {
sprintf(str, "%d", loc2);
printf("%c\n", str[strlen(str) - 1]);
} else {
sprintf(str, "%d", loc2 + 1);
printf("%c\n", str[res2 - 1]);
}
}
return 0;
}