题意:一个由正整数组成的序列,序列的特点是 1 12 123 1234 12345 123456 ,求在n位置的数值是多少
思路:把这个序列分组,每一个连续序列为1组,第一组 1 第二组 12 第三组 123.....,用log10( double(i) )+1可以求每个数占多少位
置,例如123占3个位置,这样我们可以求出第 i 组占多少个位置和前 i 组占多少位置,对于所求 n 位置,我们可以先求出它属于哪一
组,在这一组里,再求 n 位置所代表的数在这一组的具体位置,在求这个位置上的数是什么
#include <stdio.h>
#include <iostream>
#include <algorithm>
#include <string.h>
#include <math.h>
#include <string>
#include <vector>
#include <queue>
#include <stack>
#include <set>
#include <map>
using namespace std;
typedef long long ll;
const int MAXN=40005;
ll a[MAXN],sum[MAXN];
//a数组代表第i组里有多少个数
//sum数组代表前i组有多少个数
ll n;
void init()//打表
{
a[0]=0;
sum[0]=0;
for(int i=1;i<=MAXN;i++)
{
a[i]=a[i-1]+log10(1.0*i)+1;
sum[i]=sum[i-1]+a[i];
}
}
int main(void)
{
init();
int t;
scanf("%d",&t);
while(t--)
{
int i=1;
scanf("%lld",&n);
//先找第n个位置的数属于哪个组
while(sum[i]<n) i++;
//pos是这个位置代表的数在它属于的那个组里的位置
int pos=n-sum[i-1];
int summ=0;
int j;
for(j=1;j<=i;j++)
{
summ+=log10(1.0*j)+1;
if(summ>=pos) break;
}
//恰好是j的末尾
if(summ==pos) printf("%d\n",j%10);
//没有在j的末尾
if(summ>pos){
int ans=1;
for(int k=1;k<=summ-pos;k++)
ans*=10;
printf("%d\n",(j/ans)%10);
}
}
return 0;
}