poj1019(Number Sequence)

题目地址:Number Sequence

题目大意:

    有一串序列由阿拉伯数字够成11212312341234512345612345671234567812345678912345678910123456789101112345678910.......然后问你第几位数字是什么输出该数字。

解题思路:

    排列组合。假如算第79位数字为多少,先计算出它在那个1-n的区间,可以看出79在1-12这段数字的区间,然后计算出前面1、1-2、1-3....1-11所有数的总和有多少位减去之后,再通过模拟在1-12区间内具体看79在1-12区间里的第几位,找到输出,可以看出前9个区间很容易看出C(1,1)、C(2,1)...C(9,1)。但是到第十个的时候就变了:

1                C(1,1)

1-2             C(2,1)

...

1-9             C(9,1)

1-10            C(10,1)+C(1,1)

1-11            C(11,1)+C(2,1)

...

1-99            C(99,1)+C(99-10+1,1)

1-100          C(100,1)+C(100-10+1,1)+C(1,1)

1-101          C(101,1)+C(101-10+1,1)+C(101-100+1,1)

...

依次类推因为输入的i 为2147483647,所以大约1-1000000 的时候位数就应该足够了。

具体看代码:

  1 #include <algorithm>
  2 #include <iostream>
  3 #include <sstream>
  4 #include <cstdlib>
  5 #include <cstring>
  6 #include <cstdio>
  7 #include <string>
  8 #include <bitset>
  9 #include <vector>
 10 #include <queue>
 11 #include <stack>
 12 #include <cmath>
 13 #include <list>
 14 //#include <map>
 15 #include <set>
 16 using namespace std;
 17 /***************************************/
 18 #define ll long long
 19 #define int64 __int64
 20 #define PI 3.1415927
 21 /***************************************/
 22 const int INF = 0x7f7f7f7f;
 23 const double eps = 1e-8;
 24 const double PIE=acos(-1.0);
 25 const int d1x[]= {0,-1,0,1};
 26 const int d1y[]= {-1,0,1,0};
 27 const int d2x[]= {0,-1,0,1};
 28 const int d2y[]= {1,0,-1,0};
 29 const int fx[]= {-1,-1,-1,0,0,1,1,1};
 30 const int fy[]= {-1,0,1,-1,1,-1,0,1};
 31 const int dirx[]= {-1,1,-2,2,-2,2,-1,1};
 32 const int diry[]= {-2,-2,-1,-1,1,1,2,2};
 33 /*vector <int>map[N];map[a].push_back(b);int len=map[v].size();*/
 34 /***************************************/
 35 void openfile()
 36 {
 37     freopen("data.in","rb",stdin);
 38     freopen("data.out","wb",stdout);
 39 }
 40 priority_queue<int> qi1;
 41 priority_queue<int, vector<int>, greater<int> >qi2;
 42 /**********************华丽丽的分割线,以上为模板部分*****************/
 43 
 44 int main()
 45 {
 46     int cas;
 47     scanf("%d",&cas);
 48     while(cas--)
 49     {
 50         int n;
 51         scanf("%d",&n);
 52         long long sum=0;
 53         int i,j;
 54         long long a[10];
 55         memset(a,0,sizeof(a));
 56         int d=0;
 57         long long ce1=0,ce2=0;
 58         for(i=1;; i++)
 59         {
 60             if (i==10)
 61             {
 62                 d=1;
 63                 a[d]=10;
 64             }
 65             else if (i==100)
 66             {
 67                 d=2;
 68                 a[d]=100;
 69             }
 70             else if (i==1000)
 71             {
 72                 d=3;
 73                 a[d]=1000;
 74             }
 75             else if (i==10000)
 76             {
 77                 d=4;
 78                 a[d]=10000;
 79             }
 80             else if (i==100000)
 81             {
 82                 d=5;
 83                 a[d]=100000;
 84             }
 85             sum+=i;
 86             for(j=1; j<=d; j++)
 87             {
 88                 sum+=i-a[j]+1;  //计算前面区间多少个。
 89             }
 90             if(sum<n)
 91                 ce1=sum;
 92             else
 93             {
 94                 ce2=i;  //记住i在哪个区间内
 95                 break;
 96             }
 97         }
 98         long long cnt=1;
 99         long long sum1=0;
100         int Ce1=0,Ce2=0;
101         for(i=1; i<=ce2; i++)  //具体找到哪个数包含第i位
102         {
103             if (i>=100000)
104             {
105                 cnt=6;
106             }
107             else if (i>=10000)
108             {
109                 cnt=5;
110             }
111             else if (i>=1000)
112             {
113                 cnt=4;
114             }
115             else if (i>=100)
116             {
117                 cnt=3;
118             }
119             else if (i>=10)
120             {
121                 cnt=2;
122             }
123             sum1+=cnt;
124             if (sum1>=(n-ce1))
125             {
126                 Ce2=i; 
127                 break;
128             }
129             else
130                 Ce1=sum1;
131         }
132         int f=n-ce1-Ce1;  //然后找到包含第i位的数f  计算出i位为数f的第几位
133         int ff;
134         for(i=0;i<=cnt-f;i++)
135         {
136             if (i==cnt-f)
137             {
138                 ff=Ce2%10;
139             }
140             else
141                 Ce2/=10;
142         }
143         printf("%d
",ff);
144     }
145     return 0;
146 }
View Code
原文地址:https://www.cnblogs.com/ZhaoPengkinghold/p/4002700.html