poj 1019

懂了

题意是给一串 1 12 123 1234 12345 123456 。。。。这样的数字问第

i个数字是多少

 

Sample Input

 

2
8
3

 

Sample Output

 

2
2

 

 1 #include<math.h>
 2 #include<cstdio>
 3 #include<iostream>
 4 using namespace std;
 5 unsigned int a[31270],s[31270]; //a是到第i个数字的位数,s是第i组的位数
 6 void reset()//打表
 7 {
 8     int i;
 9     a[1]=1;
10     s[1]=1;
11     for(i=2;i<31270;i++)
12     {
13         a[i]=a[i-1]+(int)log10((double)i)+1;
14         s[i]=s[i-1]+a[i];
15     }
16     /*for(i=1;i<=100;i++)
17     {
18         printf("%d ",a[i]);
19     }
20     printf("\n");
21     for(i=1;i<=100;i++)
22     {
23         printf("%d ",s[i]);
24     }*/
25 }
26 
27 int main()
28 {
29     int T;
30     int n;
31     int i;
32     scanf("%d",&T);
33     reset();
34     while(T--)
35     {
36         scanf("%d",&n);
37         i=1;
38 
39         while(s[i]<n) i++;  /* 找到 n 所在的组 */
40 
41         int pos=n-s[i-1];   /* n 在该组的下标 */
42         int tmp=0;
43         for(i=1;tmp<pos;i++)    /* length: n指向的数字的最后一位的下标 */
44         {
45             tmp+=(int)log10((double)i)+1;
46         }
47         printf("%d %d\n",pos,tmp);
48         int k=tmp-pos;
49         printf("%d\n",(i-1)/(int)pow(10.0,k)%10) ;/*从右向左求,比如123456,k=2,则结果为4*/ /* 去掉所求位后面的数字然后取余 */
50     /* i: n指向的数字 + 1 */
51 
52     }
53     return 0;
54 
55 }

 

posted @ 2015-02-06 17:09  miao_a_miao  阅读(195)  评论(0编辑  收藏  举报