计算一个十进制数的位数 (int)log10((double)i) + 1
#include <stdio.h>
#include <cmath>
unsigned int a[32000], s[32000];
void table()
{
int i;
a[1] = 1;
s[1] = 1;
for(i = 2; i < 31270; i++)
{
a[i] = a[i-1] + (int)log10((double)i) + 1; //第i组数字的个数,120算是三个
s[i] = s[i-1] + a[i]; //前i组数字的个数
}
}
int solve(unsigned int n)
{
int i = 1,pos;
int length = 0;
while (s[i] < n) i++;
pos = n - s[i-1];
for (i = 1; length < pos; i++)
length += (int)log10((double)i) + 1;
return ( (i-1)/(int)pow((double)10,length-pos) )%10;
}
int main()
{
int t;
unsigned int n;
table();
scanf("%d",&t);
while(t--)
{
scanf("%u",&n);
printf( "%d\n",solve(n) );
}
return 0;
}