P1895 数字序列
题目背景
查找数字
题目描述
在下列的无穷数字序列1121231234123451234561234567123456781234567891234567 8910123456789101112345678910......中,查找第i个数字。
输入格式
第一行为正整数t(1≤t≤10),表示测试数据组数。接下来t行,每行一个正整数i(1≤i≤2^31-1)。
输出格式
对于每一个i,输出对应位置上的数字。
输入输出样例
输入 #1
2 3 8
输出 #1
2 2
思路
预处理不必拆开每个数,只要像LCA一样对整十数(10,100,1000......)记录即可
代码:
#include<cmath>
#include<cstdio>
#include<cstring>
#include<iostream>
#include<algorithm>
using namespace std;
const int N=40010;
int p=1,t,n;
int a[N],lis[N];
int main() {
for(int i=1; i<=40000; i++) {
a[i]=a[i-1];
if(i==p) {
a[i]++;
p*=10;
}
}
for(int i=1; i<=40000; i++)
lis[i]=lis[i-1]+a[i];
scanf("%d",&t);
while(t--) {
scanf("%d",&n);
for(int i=1; n>lis[i]; i++)
n-=lis[i];
int top=1;
while(n>a[top])
n-=a[top++];
int ans[10];
for(int i=a[top]; i; i--) {
ans[i]=top%10;
top/=10;
}
printf("%d\n",ans[n]);
}
return 0;
}

浙公网安备 33010602011771号