1. 程式人生 > >Leetcode|Pow(x,n)

Leetcode|Pow(x,n)

Implement pow(x, n).
x是double型別,n是int型別;

邊界條件:x==0和n==0
n為負數: 結尾取個倒數即可
效率問題:
解法1:一個一個乘,肯定超時。
解法2:用2的m次方和n比較。因為n可以表示成2的m次方的多項式相加的形式。
問題是:表示2的n次方(用移位表示),1<<30是(INT_MAX/2) ,1<<31 就是INT_MIN。
但是n==INT_MAX的情況怎麼辦呢。比如,輸入0.00001, 2147483647 超時。
//無法處理INT_MAx的程式碼,多項式的運用。

double myPow(double
x, int n) { if(x==0) return 0; if(n==0) return 1; bool isNeg=false; unsigned int pos=n; if(n<0) { isNeg=true; pos=-n;//有問題,INT_MIN } double res=1; int bit=0;//記錄n和2的冪的關係 for(;(1<<bit)<=pos;bit++); bit--; double pow[bit+1]; for(int i=0
;i<=bit;i++){//陣列存不完全,最多到x的2^30次方 if(i==0) pow[i]=x; else pow[i]=pow[i-1]*pow[i-1]; } for(int i=bit;pos>0&&i>=0;i--){ if(pos>=(1<<i)){ res*=pow[i]; pos-=1<<i; } } return (!isNeg) ? res : (1/res); }

解法3:利用x=x*x 來快速減少n,以指數的速度減少。
利用無符號的整型儲存n;
n為偶數的話,x=x*x,n>>1; n遲早都會是1,利用n為奇數時候res*=x;
n為奇數的話,res*=x;

例如n==15; 第一次檢驗n為奇數,res*=x;
n變為7,x變為2次方。
n為奇數,res*=x;(res為x的三次方)
n變為3,x為4次方。
n為奇數,res*=x;
。。。
res=1*x^1*x^2*x^4*x^8;
AC的程式碼。

double myPow(double x, int n) {
if(x==0) return 0;
if(n==0) return 1;
bool isNeg=false;
unsigned int pos=n;
double res=1;
if(n<0) {
isNeg=true;
pos=-n;
}
while(pos){
if(pos&1){
res*=x;
}
pos>>=1;
x*=x;
}
return (!isNeg) ? res : (1/res);
}