题意:
一直一个有序数组,给定一个数字n代表已知数组的第n个数,求该书是几。
分析:
1,根据数组规律对其分组:1 12 123 1234 12345......
2,首先求n在第几组中,再求n在其分组的第几个数中同时我们也可求得是该书的第几位。
3,我们分得的数组中数字依次变大,位数越来越多,但我们是要按照每一个数字来计算位置信息。比如:123(一百二十三)是三个数,所 以们就用到log10求得其位数。
#include<iostream>
#include<cmath>
using namespace std;
#define size 31269
unsigned a[size],s[size];
void play_table()
{
int i;
a[1]=s[1]=1;
for(i=2;i<size;i++)
{
a[i]=a[i-1]+(int)log10((double)i)+1;//a[i]是第i组最大数的位数。
s[i]=s[i-1]+a[i];//s[i]是第i组的长度。
}
}
int main()
{
play_table();
int t,n,i,pos,len;
cin>>t;
while(t--)
{
i=1;len=0;
cin>>n;
while(n>s[i])
{
i++;
}//求的n在第几组中。
pos=n-s[i-1];//n在其所在组中的位置。
for(i=1;len<pos;i++)
len+=(int)log10((double)i)+1;//求得n在第几个数的第几位。
cout<<(i-1)/(int)pow((double)10,len-pos)<<endl;
}
return 0;
}