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