poj1019 Number Squence

题意:
  一直一个有序数组,给定一个数字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 }

 

posted @ 2013-10-17 21:52  Neptunes  阅读(182)  评论(0编辑  收藏  举报