题目链接
注意点
- 暴力乘n会超时
解法
解法一:递归。折半计算,每次把n缩小一半,这样n最终会缩小到0,任何数的0次方都为1,这时候我们再往回乘。如果此时n是偶数,直接把上次递归得到的值算个平方返回即可,如果是奇数,则还需要乘上个x的值。还有一点需要引起我们的注意的是n有可能为负数。
class Solution {
public:
double myPow(double x, int n) {
if(n == 0) return 1;
double temp = pow(x,n/2);
if(n%2 == 0) return temp*temp;
if(n > 0) return temp*temp*x; //n是奇数
return temp*temp/x;
}
};
解法二:非递归,让i初始化为n,然后看i是否是2的倍数,是的话x乘以自己,否则res乘以x,i每次循环缩小一半,直到为0停止循环。最后看n的正负,如果为负,返回其倒数。
class Solution {
public:
double myPow(double x, int n) {
int i;
double res = 1.0;
for(i = n;i != 0;i /= 2)
{
if(i%2 != 0) res *= x;
x *= x;
}
if(n > 0) return res;
else return 1/res;
}
};