問題可以採用遞歸的形式求解,但是邊界處理爲易錯點,好吧,承認處理了挺久的。
遞歸解法:
class Solution {
public double myPow(double x, int n) {
if (n==0) {
return 1.0;
}
if(n == Integer.MIN_VALUE){
return myPow(x*x, n/2);
}
if (n<0) {
n=-n;
x=1/x;
}
if (n%2==0) {
return myPow(x*x,n/2);
}else{
return x*myPow(x*x,n/2);
}
}
}
非遞歸解法:
class Solution {
public double myPow(double x, int n) {
if(x==1||x==-1){
if (x==-1&&n%2==0) {
return -x;
}
return x;
}//處理x=-1或x=1的情況
if (n<0) {
x=(double)1/x;
n=-n;
if(n==Integer.MIN_VALUE){
return 0;
}//注意,如果沒有這句,會輸出無窮,但是加了這一句之後,結果直接給返回0
}
double pow=1;
while(n!=0){
if ((n&1)!=0) {
pow*=x;
}
x*=x;
n=n>>1;
}
return pow;
}
}