用第二种方法!
package Level3;
/**
* Pow(x, n)
* Implement pow(x, n).
*
*/
public class S50 {
public static void main(String[] args) {
System.out.println(pow(2, -2));
}
public static double pow(double x, int n) {
if(n < 0){ // 对负数的处理
return 1.0 / rec(x, n);
}
return rec(x, n);
}
// 二分法
public static double rec(double x, int n){
if(n == 0){
return 1;
}
if(n == 1){
return x;
}
double tmp = rec(x, n/2);
// if(n%2 == 0){ // 偶数情况
if((n&1) == 0){ // 偶数情况
return tmp * tmp;
}else{ // 奇数情况
return tmp * tmp * x;
}
}
}
Second try:
为了正确计算x的n次幂,还需要考虑到以下一些情况:
1) x取值为0时,0的正数次幂是1,而负数次幂是没有意义的;判断x是否等于0不能直接用“==”。
2) 对于n取值INT_MIN时,-n并不是INT_MAX,这时需要格外小心。
3) 尽量使用移位运算来代替除法运算,加快算法执行的速度。
http://blog.csdn.net/fengbingyang/article/details/12236121public static double pow(double x, int n) {
if(n == 0){
return 1;
}
if(n == 1){
return x;
}
if(n < 0){
if(n == Integer.MIN_VALUE){
return 1.0/(pow(x,Integer.MAX_VALUE)*x);
}else{
return 1.0/pow(x,-n);
}
}
double half = pow(x,n/2);
double ret = half*half;
if(n%2==1){
ret*=x;
}
return ret;
}
public class Solution {
public double pow(double x, int n) {
if(n == 0) {
return 1;
}
boolean neg = false;
if(n < 0) {
neg = true;
n = -n;
}
double half = pow(x, n/2);
double ret = 0;
if((n & 1) == 0) {
ret = half * half;
} else {
ret = half * half * x;
}
if(neg) {
ret = 1.0 / ret;
}
return ret;
}
}