这个题数据挺大的,本来我想定义str[2147483647]然后把它跑出来存起来,读入数据a后直接输出str[a-1],但是数据太大了,所以先手算了一下一个大概的范围,
9 45
99 9045
999 1395495
9999 189414495
然后在每个小区间内再去求具体的数字。
#include<cstdio>
#include<iostream>
#include<cstring>
using namespace std;
int goal;
char str[500000],ss[50];
int n;
long long int num=0,t;
void solve1()
{
int s=0,i=0;
while(++i)
{
if(s+i>goal)
break;
s+=i;
}
i--;
int a=goal-s;
if(goal==s)
cout<<i%10<<endl;
else cout<<str[a-1]<<endl;
}
void solve2()
{
goal-=45;
int s=0,i=9;
while(++i)
{
if(s+2*i-9>goal)
break;
s+=2*i-9;
}
i--;
int a=goal-s;
if(goal==s)
cout<<i%10<<endl;
else cout<<str[a-1]<<endl;
}
void solve3()
{
goal=goal-9045;
int s=0,i=99;
while(++i)
{
if(s+3*i-108>goal)
break;
s+=3*i-108;
}
i--;
int a=goal-s;
if(goal==s)
cout<<i%10<<endl;
else cout<<str[a-1]<<endl;
}
void solve4()
{
goal=goal-9045-1386450;
int s=0,i=999;
while(++i)
{
if(s+4*i-1107>goal)
break;
s+=4*i-1107;
}i--;
int a=goal-s;
if(goal==s)
cout<<i%10<<endl;
else cout<<str[a-1]<<endl;
}
void solve5()
{
goal=goal-189414495;
long long int s=0,i=9999;
while(++i)
{
if(s+5*i-11106>goal)
break;
s+=5*i-11106;
}
i--;
long long int a=goal-s;
//cout<<i<<" "<<a<<" "<<goal<<endl;
if(goal==s)
cout<<i%10<<endl;
else cout<<str[a-1]<<endl;
}
int main()
{
//freopen("in.txt","r",stdin);
for(int j=1; j<=31270; j++)
{
n=0;
int jj=j;
while(jj/10)
{
ss[n++]=jj%10+'0';
jj/=10;
}
ss[n++]=jj+'0';
ss[n]='\0';
for(int k=n-1; k>=0; k--)
str[num++]=ss[k];
}
scanf("%lld",&t);
while(t--)
{
scanf("%d",&goal);
if(goal<=45)
solve1();
else if(goal<=9000+45)
solve2();
else if(goal<=9000+45+1386450)
solve3();
else if(goal<=189414495)
solve4();
else
solve5();
}
return 0;
}