数 字 序 列 数字序列 数字序列
题目链接:luogu 1895
题目
在下列的无穷数字序列1121231234123451234561234567123456781234567891234567 8910123456789101112345678910…中,查找第i个数字。
输入
第一行为正整数t(1≤t≤10),表示测试数据组数。接下来t行,每行一个正整数i(1≤i≤2^31-1)。
输出
对于每一个i,输出对应位置上的数字。
样例输入
2
3
8
样例输出
2
2
思路
这道题就是模拟。
由题意可得这个无限序列分为无限个小序列,小序列为“1”、“12”、“123”、“1234”……以此类推。
我们先一个序列一个序列的推,能用完还有位置的就继续推,用不完就停下来。
然后就枚举最后一个序列中的每一个数字,在再从而枚举每一个字符。到了就输出,并退出;不到就继续枚举,知道枚举到题为止。
代码
#include<cstdio>
using namespace std;
int t,x;
void wei(int xx)//枚举每一个数字的每一个字符
{
if (xx>9) wei(xx/10);
if (x)
{
x--;
if (!x)
printf("%d\n",xx%10);//输出
}
}
int main()
{
scanf("%d",&t);//读入
for (int i=1;i<=t;i++)
{
scanf("%d",&x);//读入
int e=1,sum=1;//初始化
while (x>sum)//枚举前面的每一段序列
{
x-=sum;
e++;
int temp=e;
while (temp)//枚举每一位
{
sum++;
temp/=10;
}
}
if (x==sum) printf("%d\n",e%10);//刚刚好最后一段全部打完
else for (int i=1;i<=e;i++)//枚举序列的每一个数字
{
wei(i);//枚举每一个数字的每一个字符
if (!x) break;//到了输出了就退出
}
}
return 0;
}