洛谷 P1895 数字序列
题目
题目背景
查找数字
题目描述
在下列的无穷数字序列
1121231234123451234561234567123456781234567891234567 8910123456789101112345678910......
中,查找第i个数字。
输入输出格式
输入格式:
第一行为正整数t(1≤t≤10),表示测试数据组数。接下来t行,每行一个正整数i(1≤i≤2^31-1)。
输出格式:
对于每一个i,输出对应位置上的数字。
输入输出样例
输入样例#1:
2
3
8
输出样例#1:
2
2
题解
前缀和
先判断该位数字在第几组数列中(1、12、123……),然后再判断该位数字在该组数列中所处的数字为x中的第i位,然后对x对10取模x的长度-i+1次,输出即为答案。
代码
#include<cstdio>
using namespace std;
int t,n,x,len,p,w;
int q[40005],sum[40005];
void write(int x,int y)
{
int ans;
while (y--) ans=x%10,x/=10;
printf("%d\n",ans);
}
int main()
{
scanf("%d",&t);
for (int i=1;i<=40000;i++)
{
x=i;len=0;
while (x!=0) len++,x/=10;
q[i]=q[i-1]+len;sum[i]=sum[i-1]+q[i];
}
while (t--)
{
p=0;
scanf("%d",&n);
while (n>sum[p+1]) p++;
n-=sum[p];p=0;x=1;
while (n>q[p+1]) p++;
n-=q[p];
write(p+1,q[p+1]-q[p]-n+1);
}
return 0;
}