取一个整数的前几位

来源:互联网 发布: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,谢谢他的耐心讲解,才让我明白这其中的道道,现将本文献给和我一样想知道其真相的有心人~~~


0 0
原创粉丝点击