Pow(x, n)
2016-05-16 11:13
190 查看
![](https://images2015.cnblogs.com/blog/697008/201605/697008-20160516100300076-483979420.png)
这道题的直观思路不难,但是要注意很多细节问题。
首先,x要考虑整数、小数和0的情况。0不能取负数次方,0的0次方没有数学意义,可以取0也可以取1。
由于这里要处理x为小数的情况,因此x的类型为double,要判断一个double类型的x是否等于0,不能直接用(x==0.0),因为在计算机内表示小数时都有误差。
判断两个小数是否相等,只能判断它们的绝对值之差是否在一个很小的范围内。
其次,当n为负数是,要注意有一个取倒数的操作。
比较直观的解法如下:
class Solution { public: bool equal(double x1, double x2) { if((x1-x2>-0.000001)&&(x1-x2<0.000001)) return true; else return false; } double myPow(double x, int n) { double result=1; if(equal(x,0.0)) return 0.0; if(n==0) return 1.0; else if(n>0) { for(int i=0;i<n;i++) result*=x; } else { for(int i=0;i<(-n);i++) result*=x; result=1/result; } return result; } };
但是这种方法没有考虑时间复杂度,当n很大时,无法满足时间复杂度的要求。因此采用下面递归的方法,将求一个数的n次方转化为求一个数n/2次方再平方的问题:
class Solution { public: bool equal(double x1, double x2) { if((x1-x2>-0.000001)&&(x1-x2<0.000001)) return true; else return false; } double myPow(double x, int n) { double result=1; bool flag=false; if(equal(x,0.0)) return 0.0; if(n==0) return 1.0; if(n==1) return x; if(n<0) flag=true; n=(n>0)?n:(-(++n)); double half_result=myPow(x,n/2); result = half_result*half_result; if(n&1==1) result*=x; if(flag) result=1.0/(result*x); return result; } };
当遇到测试用例x=2.0,n=INT_MIN时,(-n)的值就会溢出。因为INT_MAX为2147483647,但是INT_MIN为2147483648。因此在n为负数时,可以先将n-1,最后在计算result时再乘回来。
相关文章推荐
- UML类图几种关系的总结(转载 http://blog.csdn.net/tianhai110/article/details/6339565 )
- asp.net 微信支付 错误解决方案
- NFA转换成DFA——汉字形式数字转换成整数数字
- Box2d源码学习<二>内存管理之SOA的实现
- GCD 中组队列group与Afnetworking的结合使用
- Android SingleTask 探究
- Java文件与IO(四)之其他流
- shader内置变量
- 关于loadView
- Android Dev Intro - Camera Close Relevant
- lamp 环境下部署SSL
- IOS的加密
- js的new运算符做了哪些事情
- Android刷机遇到的几个命令
- Mybatis书写sql时各种注意事项
- 使用TestFlight和蒲公英测试的区别
- Jquery判断两个object是否是同一个对象
- 【Leetcode】Consecutive Numbers
- vi编辑只读文档无法保存的解决办法
- python 无法使用方向键退格键