POJ 1019- Number Sequence(规律定位)

Number Sequence

Time Limit:1000MS     Memory Limit:10000KB     64bit IO Format:%I64d & %I64u

Submit Status Practice POJ
1019

Appoint description: 
System Crawler  (2015-05-22)

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...Sk. Each group Sk consists of a sequence of positive integer numbers ranging from 1 to k, written one after another.

For example, the first 80 digits of the sequence are as follows:

11212312341234512345612345671234567812345678912345678910123456789101112345678910

Input

The first line of the input file contains a single integer t (1 ≤ t ≤ 10), the number of test cases, followed by one line for each test case. The line for a test case contains the single integer i (1 ≤ i ≤ 2147483647)

Output

There should be one output line per test case containing the digit located in the position i.

Sample Input

2
8
3

Sample Output

2
2

题意:在给出的数字串中定位位置。

思路:然而这个字符串是有规律的,1   12   123   1234   12345   123456 and so on(然而要注意多位的数是要分开来看的,Eg 10要看成1和0)

首先当然要把1   12   123   1234  分开组,先计算一下到第i组的时候与多少位数,以及前i组一共有多少个数,对int熟悉的巨巨们应该知道2147483647刚好是int的正整数最大极限值,然而有31268组即可。

然后对于给出的提问数字n,先判断在哪一组数到哪一组数之间,然后再判断那一位是什么。

特别注意的是log()和pow()函数的使用

两个都是重载函数,函数原型分别为

double log(double)

float log(float)

double pow(double , double)

float pow(float ,float)

所以当传参的类型不是double或float时,必须强制转换为其中一种类型,否则编译出错。一般建议用double

PS:详情请看------.>点击打开链接

#include <stdio.h>
#include <math.h>
#include <string.h>
#include <stdlib.h>
#include <iostream>
#include <sstream>
#include <algorithm>
#include <set>
#include <queue>
#include <stack>
#include <map>
using namespace std;
typedef long long LL;
const int inf=0x3f3f3f3f;
const double eps=1e-10;
const double pi= acos(-1.0);
const int MAXN=31269;
LL a[MAXN];//第i组序列的长度
LL b[MAXN];//前i组序列的长度
void Init()//
{
    a[1]=b[1]=1;
    for(int i=2;i<MAXN;i++){
        a[i]=a[i-1]+(int)log10((double)i)+1;//log10(i)+1 表示第i组数字列的长度 比 第i-1组 长的位数
        b[i]=b[i-1]+a[i];//前i组的长度s[i] 等于 前i-1组的长度s[i-1] + 第i组的长度a[i]
    }
}
int Find(int n)
{
    int i=1;
    while(b[i]<n)
        i++;//确定整个数字序列的第n个位置出现在第i组
    int pos=n-b[i-1];//pos为 整个数字序列的第n个位置 在 第i组中的下标值
    int len=0;
    for(i=1;len<pos;i++)
        len+=(int)log10((double)i)+1;
    return (i-1)/(int)pow((double)10,len-pos)%10;
    //之所以i-1,是因为前面寻找第i组长度时,i++多执行了一次
           //i=i-1 此时i刚好等于第n位个置上的数 (数是整体,例如123一百二十三,i刚好等于123,但n指向的可能是1,2或3)
           //pos为n指向的数字在第i组中的下标值
           //len为第i组的长度
           //那么len-pos就是第i组中pos位置后多余的数字位数
           //则若要取出pos位上的数字,就要利用(i-1)/pow(10,len-pos)先删除pos后多余的数字
           //再对剩下的数字取模,就可以得到pos
           //例如要取出1234的2,那么多余的位数有2位:34。那么用1234 / 10^2,得到12,再对12取模10,就得到2  

}

int main()
{
    int T,n;
    Init();
    scanf("%d",&T);
    while(T--){
        scanf("%d",&n);
        printf("%d\n",Find(n));
    }
    return 0;
}
时间: 2024-10-12 01:39:18

POJ 1019- Number Sequence(规律定位)的相关文章

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

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 (循环递增序列的的第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..

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

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

PKU 1019 Number Sequence(模拟,思维)

题目 以下思路参考自discuss:http://poj.org/showmessage?message_id=176353 /*我的思路: 1.将长串数分成一个个部分,每个部分是从1到x的无重复的数字序列 2.每个序列比前一个序列多的位数是他的最后一个数的位数,如12345678910比123456789多最后一个10, 即多占了两位,由此可推算出任何一个序列的长度 3.输入位置n,则从1到n查找,每次位置移动一个序列的长度,如果第j个加上序列长度超过n,则输出j这个整数的从个位数第j-n+1

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; // 本