求某个数的整数次方
来源:互联网 发布:linux文件夹权限修改 编辑:程序博客网 时间:2024/05/20 00:52
题目来源于网上一位兄弟的blog,他也给出了解法,不过我觉得下面的解法更好,其实思想是一样的。记录下自己的思想过程,备忘。
题目:实现函数double Power(double base, int exponent),求base的exponent次方。不需要考虑溢出。
分析:在开始写“主要”的功能代码之前,别忘了对输入数据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/
- 求某个数的整数次方
- 求某个数的整数次方
- 求一个数的整数次方
- 求数值的整数次方。
- 求一个整数的次方
- 求数值的整数次方
- 求数值的整数次方
- 求一个数的次方
- 数值的整数次方(求幂)
- 【算法】求数值的整数次方
- 剑指offer-数的整数次方
- 求一个数的n次方 power
- 求一个数的N次方
- 求一个数的x次方
- 求一个数的n次方
- 给定一个double类型的浮点数base和int类型的整数exponent。求base的exponent次方。
- 给定一个double类型的浮点数base和int类型的整数exponent。求base的exponent次方。
- 给定一个double类型的浮点数base和int类型的整数exponent。求base的exponent次方。
- 触摸屏驱动程序分析
- JQUERY GET
- js 日期、星座的级联显示
- PE37
- extern "C"(zz)
- 求某个数的整数次方
- 触摸屏
- 界面库选型——Qt
- 文件流与存储流(转+修正)
- ssh config info
- web service(6)-即时发布与定制发布、wsdl文档与java对象
- 经过一个星期,博客终于解封了,感谢CSDN的网站管理员!
- MyEclipse中设置文件的编码格式
- 自动化测试类书籍(转)