取一个整数的前几位
来源:互联网 发布:python启动服务器 编辑:程序博客网 时间:2024/05/22 04:53
最近在杭电acm上,看到一道类似取一个整数的前4位的编程题,刚看到此题一点想法都没有,后来经过室友的讲解,可以总结如下(其实刚开始在网上收了一下,知道算法怎么写并且经过初步测试没有问题,但不明白其原理)。
假设被取得整数为n,则取整数n的前m位(m <= n), 总体思路是这样的,首先将整数n划为一个等价的[1, 10)区间的一个数t,说白了就是移动小数点(从第0位移动到倒数第二位),接着使t * 10^(m - 1)即为所得的,如n = 123456,m = 3, 第一步移动小数点到1后面,得到t = 1.23456.第二步 使t * 10^(3 - 1) = 123,即为所得。难点就在怎样移动小数点。
现将移动点总体思路总结如下:
1. 取n以10为底的对数,即 tmpValue = log10(n);
2. 取tmpValue的小数部分 即tmpValue -= (int)tmpValue;
3. 计算10^tmpValue.
完成上面的三步,即可实现上面提到的移动小数点的思路。
证明如下:
对于任意正整数n,总可以分解成 n = (10^a) * (10^b), 其中a >= 0 的整数, b属于区间[0, 1), (1)
对其取以10为底的对数,得到 a + b..
对其取小数部分得到b, 接着计算10^b, 从(1)可以得到10^b 属于[1, 10)之间的小数,而10^a为整数,故n = (10^b) * (10^a), 其实被分解成了科学计数法的形式。故证明上面小数点的移动是正确的。
适用范围:
其实对于一个已知的数n,完全可以用除法和求余操作求出整数n的前m位数。
如 n = 1009, m = 3;
可以这样算:(int)(1009 / 10), 即可得到n的前三位。
那为什么还要适用上面的操作呢?
使用除法不能求一个表达式的前n位,特别是这个表达式的计算结果很大,大到不能使用现有的数据结构存储,此时就可以使用上面的算法,对其表达式进行求解。 当然这个算法也有限制,首先,m不能无限大,必须在现有数据结构能处理之,如在int范围内,但是一般不会有人去求那么大的数。其次,必须明确知道要计算值的通用表达式,不能是地推式。但是大多数递推表达式都能转换为通用表达式。
在此,要感谢我的室友BJQ,谢谢他的耐心讲解,才让我明白这其中的道道,现将本文献给和我一样想知道其真相的有心人~~~
- 取一个整数的前几位
- lua 取一个数字的整数部分
- lua 取一个数字的整数部分
- lua 取一个数字的整数部分
- lua 取一个数字的整数部分
- 怎么依次取到一个整数的各个位?
- 给定一个整数,如何取其各个位的数
- 取一个数的整数,但不是四舍五入,只要有小数,就取大于这个数的整数
- js取整数、取余数的方法
- js取整数、取余数的方法
- js取整数、取余数的方法
- js取整数,取余的方法
- js取整数、取余数的方法
- 取一个数的前几位
- lua实现一个小数取整数部分
- 取整数的有关方法
- php取整数的方法
- 整数的取值范围
- hdu 1010 Tempter of the Bone
- java开源调度调度框架
- Delphi中的窗体创建与销毁
- 第一步
- 查看某一职责下对应的菜单&功能&请求
- 取一个整数的前几位
- spec中内容格式
- 我多变的2013
- 学习Ejoy2D引擎--配置环境
- 621 - Secret Research
- HttpClient超时机制算法探讨
- The Linux Programming Interface - A Linux and UNIX System Programming Handbook
- 项目初期只有想法,找不到合伙人的困惑?--答案:先试着做起来
- 随笔之感 5-23