题目意思是有一种串:1 12 123 1234 12345 123456....然后输入一个n,求出n下标的数字是哪个
在参照discuss后面的讨论后感觉这些写比较符合一般人思维:由于每次增加一组后都会在原长度的基础上翻倍后再加上一个长度,该长度又刚好是新增组的序号长度,例如第10组就是多在后面+2(10是两位数);这样以来就可以枚举到刚好超过长度n时的组数,与n相减后再次枚举便可以得出具体的位置。(具体看代码吧)
#include<stdio.h>
#include<stdlib.h>
long long digit[70000];
int t,n,num;
long long solve(int x){
int add;
long long len=0;
digit[0]=0;
num=1;
while(1){
if(num/10==0)add=1;
if(num/10!=0&&num/100==0)add=2;
if(num/100!=0&&num/1000==0)add=3;
if(num/1000!=0&&num/10000==0)add=4;
if(num/10000!=0&&num/100000==0)add=5;
if(num/100000!=0)add=6;//通过打表可以确定最大组序号是不会超过这么多位数的,所以判断到这里就行。
digit[num]=digit[num-1]+add;
if(len+digit[num]<x)len+=digit[num];
else{
long long tmp=x-len;
int i;
for(i=1; i<=num; i++)if(digit[i]>=tmp)break;
int t[6];
int m=i;
for(int j=0; j<6; j++){
if(m){
t[j]=m%10;
m/=10;
}
}
printf("%d\n",t[digit[i]-tmp]);
break;
}
num++;
}
return 0;
}
int main(){
scanf("%d",&t);
while(t--){
scanf("%d",&n);
solve(n);
}
return 0;
}