剑指 Offer 16. 数值的整数次方
题目:
思路:
当时像剪绳子中的贪婪算法中的pow一样计算,但是遇到1.00的2147483647,直接超出限制,所以使用递归将2147483647 进行 >> 1 拆分。
class Solution {
public double myPow(double x, int n) {
if (n == 0) {
return 1;
} else if (n == 1) {
return x;
}
boolean flag = false;
long nlong = n;
if (n < 0) {
nlong = 0 - nlong;
flag = true;
}
x = pow(x, nlong);
if (flag) {
x = 1 / x;
}
return x;
}
public double pow(double x, long n) {
if (n == 1) {
return x;
}
if ((n & 1) == 0) {
double temp = pow(x, n/2);
x = temp * temp;
}else {
double temp = pow(x, (n - 1) / 2);
x = temp * temp * x;
}
return x;
}
}
class Solution {
public double myPow(double x, int n) {
if (n == 0) {
return 1;
} else if (n == 1) {
return x;
// 不做flag判断,直接返回1/x,
} else if (n == -1) {
return 1/x;
}
// 使用为运算
if ((n & 1) == 0) {
double temp = myPow(x, n >> 1);
x = temp * temp;
}else {
double temp = myPow(x, (n - 1) >> 1);
x = temp * temp * x;
}
return x;
}
}