題目描述:
給定一個(gè)double類型的浮點(diǎn)數(shù)base和int類型的整數(shù)exponent缰儿。求base的exponent次方散址。
解析一:
初看,就是求一個(gè) double類型的數(shù)值的n次方瞪浸,用代碼來寫就是n次數(shù)值相乘吏祸。
但是,這道題的關(guān)鍵就是對邊界值的充分考慮蹈矮。下面來依次解答:
- base==0.0
從數(shù)學(xué)規(guī)定上可知,底數(shù)不能為0蝠咆,故此時(shí)拋出異常 - 指數(shù)(exponent)是0
非零的任意數(shù)的0次方結(jié)果都是1 - 指數(shù)(exponent)是負(fù)數(shù)
“負(fù)指數(shù)冪”:a的-r次冪(r為任何正數(shù))定義為a的r次冪的倒數(shù)北滥。
代碼一:
根據(jù)如上思路,分情況可寫作代碼如下:
public class Solution {
public double Power(double base, int exponent) {
double res =1.0; //double類型數(shù)據(jù)的初始化
if(base == 0.0){
//底數(shù)不能為0
return 0.0;
}else if(exponent ==0){
//非零底數(shù)的0次冪赡茸,結(jié)果為1
return 1.0;
}else if(exponent<0){
//負(fù)指數(shù)冪
int exp = -exponent;
for(int i =0;i<exp;i++){
res *= base;
}
return 1/res;
}else{
//正指數(shù)冪
for(int j=0;j<exponent;j++){
res *= base;
}
return res;
}
}
}
這種寫法要把各種情況都考慮清楚占卧,邏輯清晰联喘,考慮全面才行。
這種算法的時(shí)間復(fù)雜度為O(N)叭喜。
解析二:
可以找出可以優(yōu)化的算法蓖谢,因?yàn)槭乔骲ase的exponent次冪,可以用遞歸
當(dāng)exponent為偶數(shù)時(shí):base^n = base^(n/2) * base^(n/2)
當(dāng)exponent為奇數(shù)是:base^n = base^(n/2) * base^(n/2) *base
這樣就可以遞歸地求出base^(n/2) 的大小啥辨,最后需要判斷exponent的奇偶再進(jìn)行最后一步運(yùn)算即可盯腌。
代碼二:
這種方法腕够,也要認(rèn)真考慮底數(shù)為0,指數(shù)為0玫荣,指數(shù)為負(fù)數(shù)的各種情況大诸。
public class Solution {
public double Power(double base, int exponent) {
double res = 1.0;
if(base==0.0){
return 0.0;
}else if(exponent==0){
return 1.0;
}
int n = exponent>0?exponent:(-exponent);
res = Power(base,n/2); //遞歸調(diào)用
res *= res;
if(n%2==1)
res *= base;
res = (exponent>0) ? res : 1/res;
return res;
}
}
用了遞歸的方法,時(shí)間復(fù)雜度優(yōu)化為O(logN)脸侥。
之前看到有其他人的解法盈厘,可以用正整數(shù)的右移一位來實(shí)現(xiàn)除以2的效果,即n>>1外遇。