剑指offer每日一刷-2017年11月22日
来源:互联网 发布:乐视线刷软件 编辑:程序博客网 时间:2024/06/10 08:18
数值的整数次方:
题目描述:
给定一个double类型的浮点数和int类型的整数exponent。求base的exponent次方。
方法1:二分幂
如计算base^exponent;如果exponent为偶数,则计算base^exponent/2(递归到exponent=0),再计算(base^exponent/2)*(base^exponent/2),就可以得出结果;
如果exponent为奇数,则先计算base^(exponent-1)/2(递归到exponent=0),
再计算(base^(exponent-1)/2)*(base^(exponent-1)/2)*base,就可以得出结果.
运行时间为51ms
/** * 方法1:二分幂 * 如计算base^exponent;如果exponent为偶数,则计算base^exponent/2(递归到exponent=0),再计算(base^exponent/2)*(base^exponent/2),就可以得出结果; * 如果exponent为奇数,则先计算base^(exponent-1)/2(递归到exponent=0),再计算(base^(exponent-1)/2)*(base^(exponent-1)/2)*base,就可以得出结果. * 运行时间为51ms */public double Power(double base, int exponent){if(exponent == 0){return 1;}if(exponent==1){return base;}int exp = exponent>0 ?exponent:-exponent;double res = Power(base,exp/2);res *= res;if(exp%2 == 1){res *= base;}return (exponent>0)?res:1/res;}方法二:位运算
假如要计算x^y(设x=3,y=35)
y的二进制表示为100011
那么x^y=(x^32)*(x^2)*(x^1)
解释一下
我们将100011(35的二进制值)从右向左看:最右边的1代表1,第二个代表2,第三个代表4...最后一个代表32
从右向左依次为1,2,4,8,16,32
正好有如下规律:
x^1 *x^1 = x^2;
x^2*x^2 = x^4;
x^4*x^4 = x^8;
1,2,4,8,正好对应8位二进制数的每一位代表的数字
定义两个变量,一个用作记录结果res,一个用作记录幂数写为二进制时,所对应的每一位二进制数时该位置的x的n次方,记为tmp。
通过判断作为幂数的数字的二进制表示从低到高位,是不是1,是1就将这时的x的n次方乘以之前的res,并存入res
//下面的算法运行时间为54ms
public double Power2(double base, int exponent){double res=1;double tmp=base;if(base == 0){return 0;}int n = exponent>0?exponent:-exponent;if(n==0){return 1;}while(n!=0){if((n&1) == 1) //判断幂数的二进制形式的最后一位是否为1,为1,则改变返回值res *=tmp;tmp *= tmp; //实现算法"x^1 * x^1 = x^2,x^2 * x^2 = x^4 ..."n>>=1;//右移幂数的二进制形式,向右移一位}return exponent>0?res:1/res;}
更多的计算数值的整数次方,可以参考http://blog.csdn.net/tcm_zhangpeng/article/details/49737509
阅读全文
0 0
- 剑指offer每日一刷-2017年11月22日
- 剑指offer每日一刷-2017年11月24日(补2017年11月23日)
- 剑指Offer每日一刷 -2017年11月11日
- 剑指Offer每日一刷 -2017年11月10日
- 剑指offer每日一刷-2017年11月12日
- 剑指offer每日一刷-2017年11月13日
- 剑指offer每日一刷-2017年11月14日
- 剑指offer每日一刷-2017年11月15日
- 剑指offer每日一刷-2017年11月16日
- 剑指offer每日一刷-2017年11月17日
- 剑指offer每日一刷-2017年11月19日
- 剑指offer每日一刷-2017年11月20日
- 剑指offer每日一刷-2017年11月21日
- 剑指offer每日一刷-2017年11月24日
- 剑指offer每日一刷2017年12月5日
- 剑指offer每日一刷
- IDEA每日提醒2017年11月3日
- 每日一练10月26日
- Python运维自动化开发之Fabric模块
- idea 创建 java web项目(图文)
- 使用request-promise验证url的可访问性
- 增删改查
- 32位Linux系统的虚拟地址映射 <二>
- 剑指offer每日一刷-2017年11月22日
- netty源码分析之-ChannelHandler与ChannelContext详解(7)
- Flask-基本应用搭建模式
- Python学习(一)----Python3.6安装
- Magina HDU
- Cannot delete or update a parent row: a foreign key constraint fails
- C语言中的操作符
- 增删改查2
- u Calculate e