POJ 1019 数学题

 1 #include <cstdio>
 2 #include <cstring>
 3
 4 using namespace std;
 5
 6 int sum[20];
 7 //sum[i]表示尾数为i的组最大可达到的数字个数
 8 void init()
 9 {
10     sum[0] = 0;
11     sum[1] = 9;
12     sum[2] = 189;
13     sum[3] = 2889;
14     sum[4] = 38889;
15     sum[5] = 488889;
16     sum[6] = 5888889;
17 }
18
19 //找到最后对应的组数属于的范围是在多少位的整数上,返回整数的位数
20 int get_bit(int &n)
21 {
22     for(int i = 0 ; i<6 ; i++){
23         if(n > sum[i] && n <= sum[i+1])
24         {
25             n -= sum[i];
26             return i+1;
27         }
28     }
29     return -1;
30 }
31 //返回g这个组中对应的数字的个数
32 int get_num_of_group(int g)
33 {
34     int t = 10;
35     int k = 1;
36     int ret = 0;
37     while(g >= t){
38         ret += t/10*9*k;
39         t *= 10;
40         k++;
41     }
42     ret += (g - t/10 + 1) * k;
43     return ret;
44 }
45
46 int main()
47 {
48     int T;
49     //cout<<get_num_of_group(100)<<endl;
50     scanf("%d" , &T);
51     init();
52     while(T--){
53         int n;
54         scanf("%d" , &n);
55         int group = 1;
56         int cnt = 1;
57         //group表示第几组,cnt表示对应组中含有的数字的个数
58         while(1){
59             if(n <= cnt) break;
60             n -= cnt;
61             group++;
62             cnt = get_num_of_group(group);
63         }
64         //cout<<"group"<<group<<" "<<n<<endl;
65         int t = get_bit(n);
66         //cout<<"t  " <<t<<endl;
67         int st;
68         //st表示从几位数字开始找起,如st = 10,表示最后这个点属于10-99范围
69         if(t < 0) st = 1 , t = 1;
70         else
71         {
72             st = 1;
73             for(int i=1 ; i<=t-1 ; i++)
74                 st *= 10;
75
76         }
77         //cout<<"st  " <<st<<endl;
78         while(n > t){
79             n -= t;
80             st++;
81         }
82         n = t + 1 - n;
83         int ans = st%10;
84         for(int i=1 ; i<=n ; i++){
85             ans = st%10;
86             st /= 10;
87         }
88         printf("%d\n" , ans);
89     }
90    // cout<<9 + 2*90 + 3*900<<endl;
91     return 0;
92 }
时间: 2024-11-03 03:26:14

POJ 1019 数学题的相关文章

POJ 1019 Number Sequence 题解

这又是一道看似简单,实际挺困难的题目. 本来想做道基础题消遣一下的,没想到反被消遣了-_-|||. 看个人的基础吧,对于数学好的会简单点,但是由于情况太多,需要都考虑全,故此难度应该在4星以上了. 我这里使用的方法就是直接打表,然后直接模拟,利用打表去掉一大段数据,剩下数据量十分小了,故此可以直接模拟. 打表是为了计算前面的周期数,把周期数直接去掉. 主要难点是后面10位数以上的数有2位, 3位,4位等情况要考虑.- 下面使用getNewNums一个函数解决了,想通了,就几行代码,还不用难理解的

Number Sequence POJ 1019

给定一个字符串满足规律 11212312345--,求其第k位的数字. 算法思路: 分组来看,第一组1 第二组12 第三组123 第K组[1:k] 1-9组每组1位, 10-99组每组2位 依次类推. 网上大部分解法,用一个数组表示到第k组时,一共需要多少位数,但这个方法需要额外的空间,而且空间大小并不是非常容易确定. 伪代码的思路:sum 表示 while true last-sum = sum; group-size = last-group-size + member-size; // 本

poj 1019 Number Sequence (组合数学)

链接:poj 1019 题意:有一个由数字组成的序列规律为 112123123412345123456123456712345678123456789123456789101234567891011 ... 输入位置n,计算这一串数字第n位是什么数字 分析:模拟分组,把1看做第1组,12看做第2组,123看做第3组... 那么第i组就是存放数字序列为 [1,i]的正整数,但第i组的长度不一定是i, 已知输入查找第n个位的n的范围为(1 ≤ n ≤ 2147483647), 那么至少要有31268

poj 1019 分块

题目来源: http://poj.org/problem?id=1019 题意: 有一串数字串,其规律为 1 12 123 1234 12345 123456 1234567 12345678 123456789 12345678910 1234567891011 123456789101112······k 输入位置n,计算这一串数字第n位是什么数字,注意是数字,不是数!例如12345678910的第10位是1,而不是10,第11位是0,也不是10.总之多位的数在序列中要被拆分为几位数字,一个

POJ 1019 组合计数

链接:POJ 1019 /***************************************** author : Grant Yuan time : 2014/10/19 14:38 source : POJ 1019 algorithm: 组合计数 ******************************************/ #include <iostream> #include <cstdio> #include <algorithm> #

【POJ 1019】 Number Sequence

[POJ 1019] Number Sequence 二分水题 放组合数学里...可能有什么正规姿势吧Orz 112123123412345...这种串 分成长度1 2 3 4 5...的串 注意有多位数 把长度累加到一个数组里 注意要累加 因为查询的时候查的是原串中对应位置的数 因此要累加上前一次的长度 然后二分处该串前的总长 用查询的位置-之前串的总长 就是在最长的串中的位置 因此还要打个最长串的表 这些我都写一个循环里了 看着有点乱 可以拆开写... 代码如下: #include <ios

poj 1019 Number Sequence (数学)

链接:http://poj.org/problem?id=1019 分析:就是计数的问题..可以先算出112123...m共有多少位,具体式子看代码..然后二分取一个最大的小于n的m,接下来考虑123...m有多少位,再二分一下求解就可以了..具体式子还是看代码.. 1 #include<iostream> 2 #include<cstdio> 3 #include<cstring> 4 using namespace std; 5 typedef long long

poj 1019 Number Sequence 【组合数学+数字x的位宽函数】

题目地址:http://poj.org/problem?id=1019 Number Sequence Time Limit: 1000MS   Memory Limit: 10000K Total Submissions: 35680   Accepted: 10287 Description A single positive integer i is given. Write a program to find the digit located in the position i in

POJ 1019 Number Sequence

题意:问有如下规律的数列的第n项是啥: 11212312341234512345612345671234567812345678912345678910123456789101112345678910 解法:每段连续数字为一组,算每组序列的长度,累加直到超过n,说明n在前一组连续数字内,枚举组内数字,累加长度直到超过n,说明n在前一数字中,找出这一数位输出. 总的来说就是一有点恶心的模拟……最后我想说…… 注意longlong 对……每次都记不住……_(:з」∠)_ 代码: #include<s