这道题想到思路就简单 想不到就悲剧了 第一次想到的算法 果断超时 后面想到分成多组来算 每组不超过1亿位 还是超时 最后看了下别人的思想 如下:
题意: 求数列的第N位是什么 不是数 是位 例如 12345678910 第十位是1 不是10
这个序列是这样的
1
12
123
1234
12345
可以算出总共有多少排 每排的位数可以算数来
给个N 就可以算出第N位数是在第几排 然后从1开始计算 速度很快 具体的看看代码
#include<cstdio>
#include<cstring>
long long s[40000];
long long T;
void Init()
{
s[1] = 1;
long long k,j,sum = s[1];
T = 2;
for(j = 2; sum <= 2147483647 ; j++)
{
if(j >= 10000) k = 5;
else if(j >=1000) k = 4;
else if(j >= 100) k = 3;
else if(j >= 10) k = 2;
else k = 1;
s[T] = s[T-1] + k;
sum += s[T];
T++;
}
}
int main()
{
#ifdef LOCAL
freopen("in.txt","r",stdin);
freopen("out.txt","w",stdout);
#endif // LOCAL
Init();///T = 32169
long long K;
scanf("%lld",&K);
while(K--)
{
long long N,n = 0,i,j,result;
scanf("%lld",&N);
long long sum = 0;
for(i = 1; sum < N ;i++)
sum += s[i];
i--;//计算出了在第几排
if(i > 1){sum -= s[i]; N -= sum;}//第i排第N位
for(j = 1; j <= i && n < N ; j++)
{
if(j >= 10000) n += 5;
else if(j >=1000) n += 4;
else if(j >= 100) n += 3;
else if(j >= 10) n += 2;
else n += 1;
}
long long k = 1;
for(long long p = 0; p < n - N ; p++)
k *= 10;
result = --j / k % 10;
printf("%lld\n",result);
}
return 0;
}