求某个数的整数次方

来源:互联网 发布:linux文件夹权限修改 编辑:程序博客网 时间:2024/05/20 00:52

题目来源于网上一位兄弟的blog,他也给出了解法,不过我觉得下面的解法更好,其实思想是一样的。记录下自己的思想过程,备忘。

 

 

题目:实现函数double Power(double base, int exponent),求baseexponent次方。不需要考虑溢出。

分析:在开始写“主要”的功能代码之前,别忘了对输入数据base和exponent进行检查!exponent是int类型,故有正负之分,为正时,比较简单;为负时,要取分数的,别忘了;还有为0的情况,当base不为0时,任何非0数的0次方等于0(没错吧?忘了,不清楚请百度),当base也为0时,0的0次方是没有意义的,可以返回错误代码。

这里直接求解的代码应该不难写,这里先考虑比较简单的情况,即base非0,exponent大于0。

当然,有更好的解法,不然就不写这blog了。。。

更好的解法是基于下面的想法:

比如求X16,可以分解成:X16=X8*X8,于是,只要求出X8,再做一个乘积就可得到X16,同理,X8=X4*X4,……依次类推。所以求X16,只需要做4次乘积:X*X、X2*X2、X4*X4、X8*X8。如果用上面代码所述方法,要进行15次乘积。

现在问题变成,怎么把exponent分解成2的若干个整数次方,尤其是当exponent不是2的整数次方时,比如6。这里就用到了二进制的一些特点,比如6的二进制为0110,6可以分解为4+2,二进制熟悉的话,这里应该是一眼可以看出来的,就是对应二进制为1的位所表示的数的和。则X6=X4*X2

作者也给出这种方法的一种实现,是比较容易理解的,用一个包含32个int的数组存储每一位对应的乘积,最终结果就是所有32个乘积的乘积。说得不清楚?结尾给你链接仔细去看……

我觉得另外一种实现更简单,也更快。

这几行代码做的事是一样的。t每次除以2表示t向右移动1位,t%2==1时,表示最右边的位为1,所以这里做的事是一样的。从t(也就是exponent)的二进制的最右边位(最低位)开始,如果为0,则不需要相乘,然后考虑第二位(通过移位实现),并且,这里用tmp来保存二进制中相应位对应的乘积,如果哪一位为1,刚把它乘到结果中去。

二进制的位,总是有一种无法言表的魅力:)

原贴地址:http://zhedahht.blog.163.com/blog/static/254111742009101563242535/

原创粉丝点击