POJ 1019 Number Sequence(组合数学)

Number Sequence

大意:给一个有规律的序列,给你一个n,求第n位的数字是多少。

最开始理解错了,理解成第n个数字是多少了,应该是第n位是多少,WA了好几遍,看了Discuss中第2147483647位答案是2,才知道是怎么回事的= =、

思路:数字的位数可以用 log10((double)i) + 1 这个公式求出来,这样逐步求精就可以慢慢地求出结果了。

 1 # include <map>
 2 # include <queue>
 3 # include <stack>
 4 # include <math.h>
 5 # include <stdio.h>
 6 # include <string.h>
 7 # include <iostream>
 8 # include <algorithm>
 9 using namespace std;
10 
11 long long a[35000], sum[35000];
12 void init()      ///打表
13 {
14     a[1] = 1;
15     sum[1] = 1;
16     for(int i = 2; i < 31270; i++)
17     {
18         ///每一组数字都比上一组长 (int)log10((double)i) + 1
19         a[i] = a[i-1] + (long long)log10((double)i) + 1;
20         sum[i] = sum[i-1]+a[i];
21     }
22 }
23 
24 void run()
25 {
26     long long m, n;
27     init();
28     scanf("%lld", &n);
29     while(n--)
30     {
31         scanf("%lld", &m);
32         int len = 0;
33         int i = 1;
34         while(sum[i] < m)   ///找到 n 所在的组
35             i++;
36         int pos = m-sum[i-1];  ///找到 n 在该组的下标
37         for(i = 1; len < pos; i++)      
38         {
39             ///len: n指向的数字的最后一位的下标
40             len += (int)log10((double)i)+1;
41         }
42         ///去掉所求位后面的数字然后取余         i: n指向的数字 + 1
43         printf("%lld\n", ((i-1)/(int)pow((double)10, len-pos))%10);
44     }
45 }
46 
47 int main(void)
48 {
49     run();
50 
51     return 0;
52 }
Number Sequence

 

posted @ 2013-11-04 20:42  GLSilence  阅读(235)  评论(0编辑  收藏  举报