面试题16-数值的整数次方
题目
实现 pow(x, n) ,即计算 x 的 n 次幂函数(即,xn)。不得使用库函数,同时不需要考虑大数问题。
思路
首先考虑递归地出口,当n为0是,结果为1,当N为1时,返回x,当n为负数的时候,由于我们使用递归地思路进行拆解,那么其实就是n为-1,返回x的倒数
比如,我们需要求出x的32次方,那么我们首先求出x的平方,那么在求出x的四次方,然后是,x的八次方,x的十六次方,x的三十二次方。这样可以大大的减少运算次数,提高运算效率。
代码
class Solution {
public:
double myPow(double x, int n) {
// 递归出口
if(n == 0) return 1;
if(n == 1) return x;
if(n == -1) return 1 / x;
// 当n为奇数时
if(n & 0x1 == 1)
{
double b = myPow(x,(n - 1) >> 1);
return b * b * x;
}
else
{
double a = myPow(x,n >> 1);
return a * a;
}
}
};
这里我们使用右移运算符代替了除以2,使用位于运算符代替了求余运算符来判断一个数是奇数还是偶数