50-pow(x,n)
2017-12-17 16:10
357 查看
类别:递归,二分
难度:medium
对n为奇数和偶数的情况分别进行讨论:
pow(x, n) = (n % 2 == 0) ? pow(x*x, n/2) : x * pow(x*x, n/2);
需要特别注意的是,因为在进行计算之前先将n转为正数,所以要考虑n = -(2^31)的情况,转为正数以后会出现溢出的情况。
方法二:
难度:medium
算法分析
如果是暴力进行循环求解的话,会超时,所以需要二分减少计算量。对n为奇数和偶数的情况分别进行讨论:
pow(x, n) = (n % 2 == 0) ? pow(x*x, n/2) : x * pow(x*x, n/2);
需要特别注意的是,因为在进行计算之前先将n转为正数,所以要考虑n = -(2^31)的情况,转为正数以后会出现溢出的情况。
代码实现
方法一:class Solution { public: double myPow(double x, int n) { if (n == 0) return 1; if (n < 0) { n = -n; x = 1/x; } // 如果是ans = 1,并且i = n,则会出现错误的输出,因为MIN_INT转为正数以后溢出 double ans = x; for (int i = n - 1; i > 0; i /= 2) { if (i % 2 != 0) ans *= x; x *= x; } return ans; } };
方法二:
class Solution { public: double myPow(double x, int n) { if (n == 0) return 1; // 对INT_MIN进行特殊处理 if (n == INT_MIN) return 1/x*myPow(x, n + 1); if (n < 0) { n = -n; x = 1/x; } return (n % 2 == 0) ? myPow(x*x, n/2):x*myPow(x*x, n/2); } };
相关文章推荐
- LeetCode50——Pow(x,n)
- [50]Pow(x, n)
- leetcode50 Pow(x, n)
- LeetCode-50-Pow(x, n)( 二分法)-Medium
- LeetCode 50 Pow(x, n)(Math、Binary Search)(*)
- LeetCode - 50/69/367/633 - Pow(x, n)、Sqrt(x)
- 【LeetCode】C# 50、Pow(x, n)
- let 50 Pow(x,n)
- Leetcode50 Pow(x,n)
- LeetCode50 Pow(x, n) 解题报告
- 50 Pow(x, n)(求x的n次方Medium)
- Leet Code 50 Pow(x, n) - 实现幂运算 - Java
- LeetCode50 Pow(x, n)
- Leetcode 50 Pow(x, n)
- [Leetcode] 50 - Pow(x, n)
- LeetCode_50---Pow(x, n)
- leetcode 50:Pow(x, n)
- LeetCode(50)Pow
- [LeetCode 50] Pow(x, n)
- LeetCode---(50)Pow(x, n)