http://user.qzone.qq.com/289065406/blog/1301527312这个题解,挺详细,不错。
注意的就是log()和pow()函数的使用 两个都是重载函数,函数原型分别为
double log(double)
float log(float)
double pow(double , double)
float pow(float ,float)
所以当传参的类型不是double或float时,必须强制转换为其中一种类型,否则编译出错。一般建议用double
#include<stdio.h>
#include<string.h>
#include<math.h>
unsigned a[31269],s[31269];
int init()
{
int i;
a[1]=s[1]=1;
for (i=2; i<31269 ; i++ )
{
a[i]=a[i-1]+(int)log10((double)i)+1;
s[i]=s[i-1]+a[i];
}
return 0;
}
int compute(int n)
{
int i=1,pos,len;
while (s[i]<n)
i++;
pos=n-s[i-1];
len=0;
for (i=1; len<pos ; i++ )
len+=(int)log10((double)i)+1;
return (i-1)/(int)pow((double)10,len-pos)%10;
}
int main()
{
int t,n,ans,i;
init();
scanf("%d",&t);
while (t--)
{
scanf("%d",&n);
ans=compute(n);
printf("%d\n",ans);
}
return 0;
}