题意:
给定一个形如11212312341234512345612345671234567812345678912345678910123456789101112345678910的序列,输入一个i,输出处于第i个位置上的数。
思路:
开始的时候以为是要输出第i个整数,然后就WA了好几发;后面又看了一遍题后发现不是整数,就是那个位置上的数;
基本的思路是:先预处理出所有序列1的位置,然后每输入一个i值就找离他最近的那个1,然后再遍历一遍那个1所在的序列就可以得到答案了。
求1的位置的时候,需要记录每个序列的长度和整数的个数(其实也就是那个序列最大的那个数),因为每一个序列都是在其前一个序列的基础上增加了一个数,所以可以用递推的思路。
代码如下:
<span style="font-size:18px;">#include<iostream>
#include<cstdio>
#include<cstring>
using namespace std;
#define LL long long
typedef struct
{
LL x,cnt,len;
}P;
P p[1000000];
int main()
{
LL len=0,n,j;
int i,k=1;
p[0].x=0; p[0].cnt=0;
while(len<2200000000)
{
p[k].x=len+1;
p[k].cnt=p[k-1].cnt+1;
int t=p[k].cnt,d=0;
while(t)
{
d++;
t=t/10;
}
p[k].len=p[k-1].len+d;
len+=p[k].len;
k++;
}
int t;
scanf("%d",&t);
while(t--)
{
scanf("%lld",&n);
for(i=0;i<k-1;i++)
if(p[i].x<=n&&p[i+1].x>n)
break;
int m=n-p[i].x+1;
int cnt=0,d=1,ans;
while(1)
{
if(d>=0&&d<=9)
cnt++;
else if(d>=10&&d<100)
cnt+=2;
else if(d>=100&&d<1000)
cnt+=3;
else if(d>=1000&&d<10000)
cnt+=4;
else if(d>=10000&&d<100000)
cnt+=5;
if(cnt>=m)
{
for(i=0;i<cnt-m;i++)
d=d/10;
ans=d%10;
break;
}
d++;
}
printf("%d\n",ans);
}
return 0;
}
</span>