Problem B
Number Sequence
Input:
 standard input
Output: standard output
Time Limit: 1 second

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 80digits of the sequence are as follows:

11212312341234512345612345671234567812345678912345678910123456789101112345678910

Input

The first line of the input file contains a single integer t (1 <=t <=25), 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                           Output for Sample Input

2

8

3

2

2

题意: 给定一个数字n,要求出第n位对应题目给定那个序列的数字是多少,序列为1 , 1, 2, 1, 2, 3, 1, 2, 3, 4.。。。以此类推。注意2位数是占2个数,3位数是占3个数这样的。

思路:题目数据为2^31 - 1。直接暴力肯定跪。所以可以分区间讨论,个位数,十位数,百位数,这样去讨论,个位数有9个区间1,[1,2],[1,3]...[1,9]一共45位。以此类推。可以位数对应的第几个区间。打出一个表来。然后根据位数在区间去查找。最后找出对应位数上的数字。

代码:

#include <stdio.h>
#include <string.h>
#include <math.h>
int t, n, pos;
long long num[100005]; void init() {//我去年打了个表
pos = 0;
memset(num, 0, sizeof(num));
for (int i = 1; i <= 5; i ++) {
for (long long j = pow(10, i - 1); j < pow(10, i); j ++) {
num[j] = num[j - 1];
int d = (j - pow(10, i - 1) + 1) * i;
for (long long k = 1; k < i; k ++)
d += (pow(10, k) - pow(10, k - 1)) * k;
num[j] += d;
}
}
} void find() {//找出对应区间
for (int i = 1; i < 100005; i ++)
if (n > num[i - 1] && n <= num[i]) {
pos = i;
break;
}
} int solve() {//找出对应数字。
int wei = n - num[pos - 1];
int sum = 0;
for (int i = 1; i <= pos; i ++) {
int sb = i;
int j;
for (j = 5; j >= 0; j --)
if (sb >= int(pow(10, j)))
break;
for (; j >= 0; j --) {
if (sb >= int(pow(10, j))) {
int fuck = sb / int(pow(10, j));
sb -= fuck * int(pow(10, j));
sum ++;
if (sum == wei)
return fuck;
}
else {
sum ++;
if (sum == wei)
return 0;
}
}
}
}
int main() {
init();
scanf("%d", &t);
while (t --) {
scanf("%d", &n);
find();
printf("%d\n", solve());
}
return 0;
}

UVA 10706 Number Sequence (找规律 + 打表 + 查找)的更多相关文章

  1. uva 10706 Number Sequence(数学规律)

    题目连接:10706 - Number Sequence 题目大意:有一个有0 ~ 9组成的序列,1   1 2    1 2 3   1 2 3 4   1 2 3 4 5 ....就是第一位为1. ...

  2. UVa 10706 - Number Sequence

    题目大意:Sk表示从1到k的字符序列,如S4为1234,现如今有如下的序列S1S2...Sk,形如1 12 123 1234这样的序列,给一个数n,让你去这个序列第n个位置上的数字. 可以构建出一个S ...

  3. HDU1005Number Sequence(找规律)

    Number Sequence Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others)T ...

  4. HDU 4279 Number(找规律)

    Number Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) Total Sub ...

  5. hdu 4952 Number Transformation (找规律)

    题目链接 题意:给你个x,k次操作,对于第i次操作是:要找个nx,使得nx是>=x的最小值,且能整除i,求k次操作后的数 分析: 经过打表找规律,会发现最后的x/i,这个倍数会趋于一个固定的值, ...

  6. HDU 4731 找规律,打表

    http://acm.hust.edu.cn/vjudge/contest/126262#problem/D 分为3种情况,n=1,n=2,n>=3 其中需要注意的是n=2的情况,通过打表找规律 ...

  7. LightOj 1245 --- Harmonic Number (II)找规律

    题目链接:http://lightoj.com/volume_showproblem.php?problem=1245 题意就是求 n/i (1<=i<=n) 的取整的和这就是到找规律的题 ...

  8. G - Harmonic Number (II) 找规律--> 给定一个数n,求n除以1~n这n个数的和。n达到2^31 - 1;

    /** 题目:G - Harmonic Number (II) 链接:https://vjudge.net/contest/154246#problem/G 题意:给定一个数n,求n除以1~n这n个数 ...

  9. UVa 1620 Lazy Susan (找规律)

    题意:给 n 个数,每次可以把4个连续的数字翻转,问你能不能形成1-n的环状排列. 析:找一下奇偶性,写几个数试试,就会找到规律. 代码如下: #include <cstdio> #inc ...

随机推荐

  1. 每日一linux命令 du [系列]

    http://www.cnblogs.com/peida/archive/2012/12/10/2810755.html   Linux du命令也是查看使用空间的,但是与df命令不同的是Linux  ...

  2. cocoaPods下载使用记录

    cocoaPods下载使用记录 参考地址: 如何在Mac OS 上安装运行Ruby运行环境 http://www.cnblogs.com/daguo/p/4097263.html cocoaPods安 ...

  3. 观察者模式在ng(Angular)中的应用

    在这个前端框架满天飞的天下,angular MVVM 的模式确实火了一把,所以最近一直在学习ng,感悟颇多,填坑无数,今天终静下心来打算更新自己久未变动的博客,做一做总结. 1.在ng中的观察者模式: ...

  4. GUI编程笔记(java)11:使用Netbeans工具进行GUI编程

    Netbeans工具:是基于java语言进行GUI界面设计的工具 Visual Studio工具:是基于C#语言进行GUI界面设计的工具

  5. CentOS LNMP安装phpMyAdmin

    假设: 已经配置好LNMP环境,并且Nginx的网页目录在/usr/local/nginx/html 1.下载phpMyAdmin wget https://files.phpmyadmin.net/ ...

  6. Uncaught SecurityError: Failed to execute 'toDataURL' on 'HTMLCanvasElement': Tainted canvases may not be exported.

    canvas绘制图片,由于浏览器的安全考虑,如果在使用canvas绘图的过程中,使用到了外域的图片资源,那么在toDataURL()时会抛出安全异常: Uncaught SecurityError: ...

  7. 浅淡Webservice、WSDL三种服务访问的方式(附案例)

    Webservice Webservice是使应用程序以与平台和编程语言无关的方式进行相互通信技术. eg:站点提供访问的数据接口:新浪微博.淘宝. 官方解释:它是一种构建应用程序的普遍模型,可以在任 ...

  8. mysql 远程访问 配置

    sudo vi /etc/mysql/my.cnf 找到bind-address = 127.0.0.1 注释掉这行:#bind-address = 127.0.0.1 或者改为: bind-addr ...

  9. Linux中的find指令

    find find是最常见和最强大的查找命令,在磁盘中查找文件,用它找到任何你想找的文件,就是速度有点慢. find    path    -option    [    -print ]    [ ...

  10. Vijos1386 IOI2007 矿工配餐 动态规划

    感觉早些年IOI的题都不难啊,也就NOIp难度……现在貌似变难了 状态用dp[n][a1][b1][a2][b2]表示 n表示处理到前n个餐车 第一组矿工得到的最近一种食物用a1表示,a1的上一种食物 ...