第二章 D - Number Sequence(1.5.10)
转载请注明出处:優YoU http://user.qzone.qq.com/289065406/blog/1301527312
大致题意:
有一串数字串,其规律为
1 12 123 1234 12345 123456 1234567 12345678 123456789 12345678910 1234567891011 123456789101112······k
输入位置n,计算这一串数字第n位是什么数字,注意是数字,不是数!例如12345678910的第10位是1,而不是10,第11位是0,也不是10。总之多位的数在序列中要被拆分为几位数字,一个数字对应一位。
解题思路:
首先建议数学底子不好的同学,暂时放一放这题,太过技巧性了,连理解都很困难
模拟分组,把1看做第1组,12看做第2组,123看做第3组……那么第i组就是存放数字序列为 [1,i]的正整数,但第i组的长度不一定是i
已知输入查找第n个位的n的范围为(1 ≤ n ≤ 2147483647),那么至少要有31268个组才能使得数字序列达到有第2147483647位
注意:2147483647刚好是int的正整数最大极限值( ),所以对于n用int定义就足矣。但是s[31268]存在超过2147483647的位数,因此要用unsigned 或long 之类的去定义s[]
详细的解题思路请参照程序的注释。
其中数学难点有2:
(int)log10((double)i)+1
(i-1)/(int)pow((double)10,len-pos)%10
非常技巧性的处理手法,其意义已在程序中标明
另外要注意的就是log()和pow()函数的使用
两个都是重载函数,函数原型分别为
double log(double)
float log(float)
double pow(double , double)
float pow(float ,float)
所以当传参的类型不是double或float时,必须强制转换为其中一种类型,否则编译出错。一般建议用double
- //Memory Time
- //476K 0MS
- #include<iostream>
- #include<math.h>
- using namespace std;
- const int size=31269;
- unsigned a[size]; //a[i] 表示第i组数字序列的长度
- unsigned s[size]; //s[i] 表示前i组数字序列的长度
- //第i组存放的数字序列为 [1,i]的正整数,但第i组的长度不一定是i
- //例如数字13要被看做1和3两个位,而不是一个整体
- /*打表,预先获取第2147483647个位的序列分组情况*/
- void play_table(void)
- {
- a[1]=s[1]=1;
- for(int i=2;i<size;i++)
- {
- a[i]=a[i-1]+(int)log10((double)i)+1; //log10(i)+1 表示第i组数字列的长度 比 第i-1组 长的位数
- s[i]=s[i-1]+a[i]; //前i组的长度s[i] 等于 前i-1组的长度s[i-1] + 第i组的长度a[i]
- } //log()是重载函数,必须对int的i强制类型转换,以确定参数类型
- return;
- }
- /*计算序列第n个位置上的数字*/
- int compute(int n)
- {
- int i=1;
- while(s[i]<n)
- i++; //确定整个数字序列的第n个位置出现在第i组
- int pos=n-s[i-1]; //pos为 整个数字序列的第n个位置 在 第i组中的下标值
- int len=0;
- for(i=1;len<pos;i++) //从第1组开始遍历第i前的每一个组,利用log10(i)+1递推第i组的长度
- len+=(int)log10((double)i)+1; //len为第i组(n所在的组)的长度
- 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
- } //pow()是重载函数,必须对int的i强制类型转换,以确定参数类型
- int main(void)
- {
- play_table();
- int test;
- cin>>test;
- while(test--)
- {
- int n;
- cin>>n;
- cout<<compute(n)<<endl;
- }
- return 0;
- }
第二章 D - Number Sequence(1.5.10)的更多相关文章
- Number Sequence 分类: HDU 2015-06-19 20:54 10人阅读 评论(0) 收藏
Number Sequence Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others) Tot ...
- ArcGIS API for JavaScript 4.2学习笔记[10] 2D添加指北针widget、视图保存、视图padding(第二章完结)
这几个例子是第二章除了入门之外比较简单的几个,就做个合集,把最核心的代码(第二参数)和 引用放上来即可,不作多解释. 2D地图添加指北针widget 2D地图一般修正方向为正北方就需要这个widget ...
- 第二章 Oracle数据库应用
第二章 Oracle数据库应用2.1 表空间和用户权限下管理 2.1.1 表空间 2.1.1.1 分类: 永久性表空间 临时性表空间 ...
- Python 第二章-列表和元组
第二章-列表和元组 2.0 在Python中,最基本的数据结构是序列(sequence).序列中的每个元素被分配一个序列号-即元素的位置, 也称为索引.第一个索引是0,第二个是1,以此类推. ...
- 第二章 NIO入门
传统的同步阻塞式I/O编程 基于NIO的非阻塞编程 基于NIO2.0的异步非阻塞(AIO)编程 为什么要使用NIO编程 为什么选择Netty 第二章 NIO 入门 2.1 传统的BIO编程 2.1.1 ...
- 第二章 C语言编程实践
上章回顾 宏定义特点和注意细节 条件编译特点和主要用处 文件包含的路径查询规则 C语言扩展宏定义的用法 第二章 第二章 C语言编程实践 C语言编程实践 预习检查 异或的运算符是什么 宏定义最主要的特点 ...
- 第二章 约束和排序数据(SQL基础)
第二章 约束和排序数据 1. 在 emp 表中选择工资介于 1500 到 2500 的员工的信息: 注意:使用 between 下边界 and 上边界时,条件包括边界值: ...
- ORACLE AUTOMATIC STORAGE MANAGEMENT翻译-第二章 ASM instance(1)
第二章 ASM INSTANCE ASM的类型,例如可以: 10g后ORACLE instance 类型增加了一个ASM种类.参数INSTANCE_TYPE=ASM进行设置. ASM实例启动命令: ...
- javascript 数据结构和算法读书笔记 > 第二章 数组
这章主要讲解了数组的工作原理和其适用场景. 定义: 一个存储元素的线性集合,元素可以通过索引来任意存取,索引通常是数字,用来计算元素之间存储位置的偏移量. javascript数组的特殊之处: jav ...
随机推荐
- Spring security与shiro
shiro更轻量级,spring security过于复杂. Apache Shiro 使用手册(一)Shiro架构介绍 Spring Security笔记:Remember Me(下次自动登录)
- ORACLE 表函数实现
1.创建表对象类型. 在Oracle中想要返回表对象,必须自定义一个表类型,如下所示: create or replace type t_table is table of number; 上面的类型 ...
- .NET RSACryptoServiceProvider PEM + DER Support
http://www.christian-etter.de/?p=771 In .NET, RSACryptoServiceProvider greatly simplifies common tas ...
- oc-数据模型的建立
@{@"name":@"David Beckham",@"age":@38,@"gender":@"男&quo ...
- 清理java环境
system32中存在3个java*.exe文件,分别是: c:/windows/system32/java.exe c:/windows/system32/javaw.exe c:/windows/ ...
- 磁盘IOPS的计算
计算磁盘IOPS的三个因素: 1.RAID类型的读写比 不同RAID类型的IOPS计算公式: RAID类型 公式 RAID5.RAID3 Drive IOPS=Read IOPS + 4*Wr ...
- C语言每日一题之No.9
再做决定之前,我还是做好自己该做的.我不希望几年后会悔恨自己为什么在最该努力的时候不愿意吃苦.尊敬的女王陛下,请接题: 一.题目:有已按升序排好顺序的字符串a,编写程序将字符串s中的每个字符按升序的规 ...
- Chrome安装FlashPlayer Debug
首先: 在谷歌浏览器上打开chrome://plugins 找到 Adobe Flash Player 然后将谷歌自带的版本停用,如果已经安装了for Netscape版,则会显示另外一个版本.(建议 ...
- Grid_Oracle Grid Infrastructure概念介绍(概念)
2014-03-09 Created By BaoXinjian Thanks and Regards
- 转-TabHost组件(二)(实现底部菜单导航)
http://www.cnblogs.com/lichenwei/p/3975095.html 上面文章<安卓开发复习笔记——TabHost组件(一)(实现底部菜单导航)>中提到了利用自定 ...