首先有一个字符串
112123123412345123456123456712345678912345678910.。。。
就是1 12 123 这样一直连下去。
然后输入数字n、,问这一串中第n个数字是什么 注意其中10占了两个位置。
我们假设这是很多个小串拼起来。
用两个数组,
分别存第一串的长度,第二串的长度。。一直存下去。
第二个数组存 到第一串为止的总长度,到第二串为止的总长度。。。
然后长度可以用 + log10(i)来算 ,这是代表这个数字有几位。
然后循环找到,你要找的这个位置是在哪一个小串。然后在找是在这个小串那个位置。
然后去找是什么值。。
注意用long long。
AC代码:
#include<iostream>
#include<cmath>
using namespace std;
#define ll long long
const int N = 78000;
ll len[N];
ll lenn[N];
int main () {
for (int i = 1 ; i < N ;i++) {
len[i] = len[i - 1] + (log10(i)) + 1;
lenn[i] = lenn[i - 1] + len[i];
}
int n;
cin >> n;
while (n--) {
ll pos ;
cin >> pos;
int i;
for (i = 1 ; i < N ;i++) {
if (lenn[i] >= pos)
break;
}
i -= 1;
ll dis = pos - lenn[i];
int j;
for ( j = 1 ; ;j++ ) {
if (len[j] >= dis)
break;
}
dis = dis - len[j - 1];
ll k;
for (k = 0; k < dis;j++) {
k += (log10(j) + 1);
}
dis = k - dis;
j -= 1;
for (int l = 0 ; l < dis ;l++) {
j /= 10;
}
int ans = j % 10;
cout << ans << endl;
}
}