题意 1 12 123 1234 12345 ....这样的序列 问第n位数字是几 是数字! 1-9!
思路:递推关系 主要是位数的计算 用a[i]=a[i-1]+(int)log10((double)i)+1; 每加一个n位数 加log10(n)+1位
还有取数字 (i-1)/(int)pow((double)10,len-pos)%10 len-pos 是到最后有多少位 数字/10^(len-pos) 就把后面几位截断了再%10就能取出要的数字了
参考:https://blog.csdn.net/lyy289065406/article/details/6648504
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<iostream>
#include<cmath>
using namespace std;
const int maxn=+;
typedef long long ll;
ll p[maxn];
ll sum[maxn];
void init(){
p[]=;
sum[]=;
for(int i=;i<maxn;i++){
p[i]=p[i-]++(int)log10(double(i));
sum[i]=sum[i-]+p[i];
}
}
int find(ll n){
int temp=lower_bound(sum+,sum+maxn,n)-sum;
int pos=n-sum[temp-];
int len=;
int i;
for( i=;len<pos;i++){
len+=+int(log10(i*1.0));
}
return (i-)/(int)pow(10.0,len-pos)%;
}
int main(){
ll n;
init();
int t;
scanf("%d",&t);
while(t--){
scanf("%lld",&n);
printf("%d\n",find(n));
}
return ;
}