题目描述
实现 pow(x, n) ,即计算 x 的 n 次幂函数。
示例:
输入: 2.10000, 3
输出: 9.26100
解题思路
原题,但是在牛客上的《剑指offer》专题中,后台测评系统不行(测试用例不全),把在牛客通过的代码放到力扣就过不了了,原因是越界,没有考虑溢出的情况。、
- 思路:二分思想递归,复杂度是对数级的。自己写的代码又长又臭。。。。。大佬代码。(但是他没有考虑
x == 0, n < 0
的特例)
参考代码
牛客上通过,但是leetcode通不过的代码
bool g_invalidInput = false;
class Solution {
public:
double myPow(double base, int exponent) {
if(doubleEqualTo0(base) && exponent < 0){
g_invalidInput = true;
return 0.0;
}
if(exponent == 0)
return 1.0;
bool isNegative = false;
if(exponent < 0){
exponent = -exponent; // 如果exponent == -2147483648,在将其装换成正数的时候,会溢出(应用long long)
isNegative = true;
}
double res = binaryPow(base, exponent);
if(isNegative)
res = 1.0/res;
return res;
}
double binaryPow(double base, int exponent){
if(exponent == 0)
return 1.0;
if(exponent == 1)
return base;
double res = binaryPow(base, exponent>>1);
res *= res;
if(exponent & 1)
res *= base;
return res;
}
bool doubleEqualTo0(double a){ // 注意这里!
if(a>-0.0000001 && a < 0.0000001) // 用 &&
return true;
return false;
}
};
正确简洁的代码(无需考虑exponent
的正负问题,推荐)
class Solution {
public:
double myPow(double x, int n) {
if(doubleEqualTo0(x) && n < 0)
return 0;
if(n == 0)
return 1;
if(n == 1)
return x;
if(n == -1)
return 1/x;
double half = myPow(x, n/2);
double rest = myPow(x, n%2);
return half * half * rest;
}
bool doubleEqualTo0(double a){ // 注意这里!
if(a>-0.0000001 && a < 0.0000001) // 用 &&
return true;
return false;
}
};