题目链接:hihocoder1349
题目大意:有一段由全体自然数组成的字符串 <mark>“0123456789101112…”</mark>,查询下标为N的字符。
解题思路:思维题,先将自然数按数位分组:{0 - 9} ; {10 - 99} ; {100 - 999} …发现每组的长度分别为 10 x 1, 90 x 2, 900 x 3 … 然后查找出N属于的组数。接着考虑它是改组数字的第几个数字,然后考虑是这个数字中的第几个位数。注意要使用长整型
#include <bits/stdc++.h>
using namespace std;
long long solve(long long n) {
if (n < 10) {
return n;
}
long long N = n;
long long bef = 10, mi = 10, i;
N -= 10;
for (i = 2; N > 9*mi*i; i++, mi*=10) { //属于几位的数字中
N -= 9*mi*i;
}
long long jiwei = N / i; //第几位数
long long jige = N % i; //这个数种的第几个
long long ans = mi + jiwei;
while (jige --) {
ans %= mi;
mi /= 10;
}
return ans/mi;
}
int main() {
long long n;
while(cin >> n) {
cout << solve(n) << endl;
}
return 0;
}