此题一看就是快速幂,但要考虑负数的情况。此处最好的做法是把x变成1/x,同时n取反。这里要注意,由于负数比正数多一个,强行取反可能会越界,要用long long处理一下。
同时,零的零次方要注意,这里如果是面试,提前问好这个怎么定义,代码中直接作为0返回了。
注意,除2用右移操作会更快。
typedef long long ll;
class Solution {
public:
double myPow(double x, int n) {
if(n == 0)return 1;
ll ln = n;
if(n < 0)x = 1/x, ln=-ln;
double ret = myPow(x, ln>>1);
ret *= ret;
if(n & 1)ret *= x;
return ret;
}
};
上述做法其实不是很优雅,可以直接让n的类型直接成ll,防止n在取最大负数时转换为正数越界。此外,上述代码x变成1/x其实很妙,不用存额外的neg标记,很棒。
值得注意:double类型存储多大的数都可以,因为存的是科学技术法,很强很强。
下面的代码应该是最棒的。
typedef long long ll;
class Solution {
public:
double myPow(double x, ll n) {
if(n == 0 || x == 1)return 1;
if(n<0)x = 1/x, n = -n;
double ret = myPow(x, n/2);
ret *= ret;
if(n&1)ret *= x;
return ret;
}
};