题目链接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;
}