題目描述
給定乙個double型別的浮點數base和int型別的整數exponent。求base的exponent次方。
思路:這道題看似很簡單,習慣性地認為用乙個迴圈,不斷乘以base,即可:
public
double
power(double
base, int exponent)
return result;
}
但是,忽略了一下幾種情況:
case1:指數為負數
case2:指數為負數且底數為0
case2:指數為0,底數也為0
修改**如下,已在牛客網提交:
public
class solution
return result;
*///以上**有什麼問題?
//1 exponent<1,即為0或負數,怎麼辦?求exponent絕對值,然後求倒數
//2 base=0,expronent<0,即分母為0,處理有三種:返回值,全域性變數,異常
//3 double base;base==0.0,帶有小數的比較
//4 0的0次方,定義
//現在對以上**進行改進
if(equal(base,0.0)&&exponent<0)
int ab***ponent=exponent;
if(exponent<0)
double result=powerwithunsignedexponent(base,ab***ponent);
if(exponent<0)
return result;
} public
static
double
powerwithunsignedexponent(double
base, int exponent)
return result;
}public
static boolean equal(double
base,double zero)
else
}public
static
void
main(string args)
}
note:
三點一,public
static boolean g_invalidinput=false;有什麼用?
因為在第三種情況,會出現異常,故在呼叫這個函式時,需要判斷或對異常進行預判處理。返回值無法區分這一異常情況,因為出錯了返回0,但也有可能是0^0,所以加上了乙個全域性變數,當出錯時,全域性遍歷為true,呼叫的時候可以檢查一下這個全域性變數的值。
二,在判斷底數是否等於0時,不是用base==0判斷,而是另外寫了乙個函式,有必要嗎?
有必要,double型數值在計算機內的表示有誤差,小數之間判斷是否相等,不能簡單用==來判斷,有意義的相等應該是相差小於某個足夠小的數。
三,public
static
double
powerwithunsignedexponent(double
base, int exponent)這個函式能否改進效率,o(logn)
乙個公式:見下圖
牛客網提交**:
public
class solution
return result;
*///以上**有什麼問題?
//1 exponent<1,即為0或負數,怎麼辦?求exponent絕對值,然後求倒數
//2 base=0,expronent<0,即分母為0,處理有三種:返回值,全域性變數,異常
//3 double base;base==0.0,帶有小數的比較
//4 0的0次方,定義
//現在對以上**進行改進
if(equal(base,0.0)&&exponent<0)
int ab***ponent=exponent;
if(exponent<0)
double result=powerwithunsignedexponent(base,ab***ponent);
if(exponent<0)
return result;
} public
static
double
powerwithunsignedexponent(double
base, int exponent)
*///a^n=a^(n/2)*a^(n/2),n為偶數
//a^n=a^((n-1)/2)*a^((n-1)/2)*a,n為奇數
if(exponent==0)
if(exponent==1)
double result=powerwithunsignedexponent(base,exponent>>1);//>>1等價於除以2
result=result*result;
if((exponent&1)==1)
return result;
}public
static boolean equal(double
base,double zero)
else
}public
static
void
main(string args)
}
note:
右移代替除以2,&代替`%
`判斷是否奇數偶數,效率更高
劍指offer面試題11
面試題1 數值的整數的次方 題目 實現函式double power double base,int exponent 求base的 exponent次方。不得使用庫函式,同時不需要考慮大數問題。思路 首先應該明確指數的可能取值 正整數,0,負整數 另外還需要考慮底數是0的情形。對於負整指數,我們可以...
劍指offer之面試題9 4 矩形覆蓋
題目描述 我們可以用2 1的小矩形橫著或者豎著去覆蓋更大的矩形。請問用n個2 1的小矩形無重疊地覆蓋乙個2 n的大矩形,總共有多少種方法?思路 用數學歸納的思想分析,得出規律。牛客網提交 public class solution if target 2 return init target int...
劍指offer之面試題11 旋轉陣列的最小數字
1 題目 把乙個陣列最開始的若干個元素搬到陣列的末尾,我們稱之為陣列的旋轉。輸入乙個遞增排序的陣列的乙個旋轉,輸出旋轉陣列的最小元素。例如 陣列為的乙個旋轉,該陣列的最小值為1。輸入引數 一維陣列numbers,陣列長度length 輸出引數 最小元素的值,或者丟擲 傳入引數錯誤 的異常 2 解題 ...