一、问题描述
二、解题思路
题目中给出底数x和指数n,一般思路是写一个循环n次的代码来解决问题,如果指数为负,将正的n计算所得的结果取倒数即可。这个方法就不在赘述。
换个思路,如果求x5,可以将其拆分成x5=x1*x0*x0*x4,对右边的x的指数结合在一起可以看成二进制的1001。对x进行位运算,遇到1就乘以相应大小的x次方,为了保证正确的次方,每一次循环都应该乘一次本身(因为每次右移一位等于除于2,所以要乘于当前的自身大小),依次求得最终解。
三、实现代码
class Solution {
public:
double myPow(double x, int n) {
if( n == 0) return 1;
if( x == 0.0) return 0;
long exp = n; //因为题目n的范围为-2^31~2^31-1,为了防止int取正时溢出,就用较大的long类型
if(n < 0) {
exp = n* (-1.0);
}
double res = 1.0;
while(exp != 0){
if( (exp &1) == 1 ){
res *=x;
}
x *=x; //保证此时的x大小为对应位数的大小
exp >>= 1;
}
return n<0 ? 1/res: res; //如果指数为负数取倒数,如果为正就正常取值。
}
};