LeetCode | Pow(x, n)
来源:互联网 发布:做网络销售工资有多高 编辑:程序博客网 时间:2024/06/07 07:34
实现double Pow(double x,int n)----x的n次幂!
题目解析:
这道题目看起来很简单,笨方法,可以一次一次的去乘,也可以折半相乘!看似简单,但中间碰到了不小的问题。
在运行过程中,出现了-2147483648超时。为什么?
来看下面代码:
class Solution{public: double pow(double x,int n){ if(n == 0) return 1.0; if(n == 1) return x; if(n < 0){ //方案一 return 1.0/pow(x,-n); //方案二 n = -n; double half = pow(x,n/2); //只计算一次,效率更高! if(n%2 == 0) return 1.0/(half*half); return 1.0/(x*half*half); } double half = pow(x,n/2); //只计算一次,效率更高! if(n%2 == 0) return half*half; return x*half*half; }};
方案一时会报错,但方案二却没有?
差别在哪里?在于整数正负数范围不对称引起的错误,-2147483648再取负数,还是其自身,那么方案一就会无限死循环下去,深层次的n还是小于0。但方案二却没有,因为传递的时候已经确保了n/2不再是最大的负数,会跳出死循环。
网上还有另外一种方法,也没有出错,来看一下:
class Solution {public: double powPositive(double x, int n){ if(n == 0) return 1; if(n == 1) return x; double tmp; if(n%2 == 0){ tmp = powPositive(x, n/2); return tmp*tmp; } tmp = powPositive(x, n/2); return tmp*tmp*x; } double pow(double x, int n) { // Start typing your C/C++ solution below // DO NOT write int main() function if(n >= 0) return powPositive(x,n); return 1/powPositive(x,-n); }};
他也是直接将-n传入。但不是本身的函数,而是子函数,况且子函数当中也不再对负数n进行判断。最后能通过测试。
但更完美的方法还是《【剑指offer】面试题11:数值的整数次方》这个里面的方案,已经把0的情况也考虑进去了,并且对负数进行了的彻底的转化unsigned int ,同时调用子函数去求解。
这道题还是很值得仔细去研究的。
0 0
- LeetCode: Pow(x, n)
- LeetCode Pow(x,n)
- [Leetcode] Pow(x, n)
- LeetCode: Pow(x, n)
- Leetcode: Pow(x,n)
- [LeetCode] Pow(x, n)
- [Leetcode] Pow(x,n)
- 【leetcode】Pow(x, n)
- [LeetCode]Pow(x, n)
- [leetcode]Pow(x, n)
- LeetCode-Pow(x, n)
- LeetCode - Pow(x, n)
- LeetCode | Pow(x, n)
- Pow(x, n) -leetcode
- 【leetcode】Pow(x, n)
- 【Leetcode】Pow(x, n)
- LeetCode Pow(x, n)
- Leetcode: Pow(x, n)
- windows下查看CPU位数
- 大家所说的full-stack框架到底是指什么
- xmpp asmack重连的逻辑
- hdu-2189-悼念512汶川大地震遇难同胞——来生一起走
- iOS UIScrollView 循环滚动(loop)
- LeetCode | Pow(x, n)
- HDOJ 3342 Legal or Not 【拓扑排序】
- linux下查看磁盘空间
- 刘强东,揭开京东未来盈利迷局
- css中margin-left与left的区别
- ZigZag Conversion
- poj2923 Relocation(状态压缩+背包)
- 30多个iOS常用动画,带详细注释
- 使用CocoaPods(一)为项目配置第三方类库