POJ 1019 Number Sequence(组合数学)
大意:给一个有规律的序列,给你一个n,求第n位的数字是多少。
最开始理解错了,理解成第n个数字是多少了,应该是第n位是多少,WA了好几遍,看了Discuss中第2147483647位答案是2,才知道是怎么回事的= =、
思路:数字的位数可以用 log10((double)i) + 1 这个公式求出来,这样逐步求精就可以慢慢地求出结果了。
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
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 }