实现库函数pow的功能,求x的n次方。
思路:二分法,每次将n变为原来的一半,将x变为x平方。如果n为偶数,直接二分;如果n为奇数,先分离一个x出来,再对n二分。
当n为负数,要将x变为1/x,将n变为-n,但是java中int32变量
n∈[−2147483648,2147483647],所以当n=−2147483648时执行n=-n会产生大数越界现象,可以先将n存入long型变量b,后面用b操作。或者可以先提出一个1/x,返回1/x*myPow(1/x,-n-1),这样可以保证n=2147483648-1=2147483647不越界。
class Solution {
public double myPow(double x, int n) {
if (x == 0){
return 0;
}
long b = n;
double res = 1.0;
if(b < 0){
x = 1 / x;
b = - b;
}
while(b > 0){
if((b & 1) == 1) res *= x;
b >>= 1;
x *= x;
}
return res;
}
}
或:
class Solution {
public double myPow(double x, int n) {
if (n == 0){
return 1;
}else if (n < 0){
return 1/x * myPow(1/x , - n - 1);
}
return (n % 2 == 0) ? myPow(x * x, n >> 1) : x * myPow(x * x, n >> 1);
}
}