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; //
本次循环比上次循环多一个数字,需要确定数字的长度。

sum += group-size;

if(sum > i)

pos = i - last_sum;

res = find(pos); //
在123456……这类字符串中找到第pos位

break;

last-group-size = group-size;

group-num++;

if(group-num/pow(10, member-size) -
(group-num-1)/pow(10, member-size))
member-size++; //从第9组跳到第10组 第99组跳到100组 ……

find 伪代码:

1-9为1位,10-99为2位……分开处理,k 为当前位数

while true

last-sum = sum;

sum += 9 * pow(10, k-1) *k

if(sum > pos)

rank = (pos - last_sum) / k;
//第k个部分的第rank个数

mod = (pos - last_sum)
%k; //第k各部分的第rank个数从前往后的第mod位

res = (pow(10, k-1) + k)/(pow(10,
k-1-mod))%10;

k++;

last-sum = sum;


 1 #include <iostream>
2 using namespace std;
3
4 long long int pow(long long int base, long long int exp)
5 {
6 long long int result = 1;
7 for(long long int i = 0; i < exp; i++) {
8 result *= base;
9 }
10 return result;
11 }
12
13 int find(long long pos)
14 {
15 long long sum = 0, last_sum = 0;
16 int k = 1;
17 int result = 0;
18
19 while(true) {
20 last_sum = sum;
21 sum += 9 * pow(10, k-1) * k;
22 if(sum > pos) {
23 long long diff = pos - last_sum;
24 long long rank = diff / k;
25 long long mod = diff % k;
26 if(k == 1) result = diff + 1;
27 else result = ((pow(10, k-1) + rank)/pow(10, k-1-mod)) % 10;
28 break;
29 }
30 k++;
31 }
32
33 return result;
34 }
35
36 int main()
37 {
38 int t;
39 long long i, group_num, member_size, sum, last_sum, last_group_sum, group_sum, pos, res;
40 cin >> t;
41 for(int j = 0; j < t; j++) {
42 group_num = 1;
43 last_group_sum = 0;
44 member_size = 1;
45 sum = 0;
46 cin >> i;
47 i = i - 1;
48 while(true){
49 last_sum = sum;
50 group_sum = last_group_sum + member_size;
51 sum += group_sum;
52 if(sum > i) {
53 res = find(i - last_sum);
54 cout<<res<<endl;
55 break;
56 }
57 last_group_sum = group_sum;
58 group_num++;
59 if(group_num/pow(10, member_size) - (group_num-1)/pow(10, member_size) == 1) member_size++;
60 }
61 }
62 return 0;
63 }

Number Sequence POJ 1019,布布扣,bubuko.com

时间: 2024-10-26 10:33:52

Number Sequence POJ 1019的相关文章

POJ 1019 Number Sequence 题解

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

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

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

poj 1019 Number Sequence 二分

Number Sequence Time Limit: 1000MS   Memory Limit: 10000K Total Submissions: 34391   Accepted: 9879 Description A single positive integer i is given. Write a program to find the digit located in the position i in the sequence of number groups S1S2...

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 Number Sequence (循环递增序列的的第K个值)

Number Sequence Time Limit: 1000MS   Memory Limit: 10000K Total Submissions: 35823   Accepted: 10340 Description A single positive integer i is given. Write a program to find the digit located in the position i in the sequence of number groups S1S2..

POJ1019 Number Sequence

Number Sequence Time Limit: 1000MS   Memory Limit: 10000K Total Submissions: 36256   Accepted: 10461 Description A single positive integer i is given. Write a program to find the digit located in the position i in the sequence of number groups S1S2..

hdu1005 Number Sequence(找循环节)

题目链接: huangjing 题意: 就是给了一个公式,然后求出第n项是多少... 思路: 题目中n的范围实在是太大,所以肯定直接递推肯定会超时,所以想到的是暴力打表,找循环节,但是也不是那么容易发现啊,所以这时候分析一下,因为最后都会mod7,所以总共有7X7总情况,即A 0,1,2,3,4,5,6,7,B也是如此,所以循环节为49,这么这个问题就解决了... 题目: Number Sequence Time Limit: 2000/1000 MS (Java/Others)    Memo

1005 Number Sequence

Problem Description A number sequence is defined as follows: f(1) = 1, f(2) = 1, f(n) = (A * f(n - 1) + B * f(n - 2)) mod 7. Given A, B, and n, you are to calculate the value of f(n). Input The input consists of multiple test cases. Each test case co