1 題目描述
題目:實現函數 double Power(double base,int exponent),求exponent 次方,不得使用庫函數,同時不考慮大數問題。
算法描述
base^exponent
一般情況 base>=0 exponent>=0
特殊情況 base=0 exponent<0 此時計算需要進行 /0 操作,導致錯誤
特殊情況 base=0 exponent=0,0^0 在數學上沒有意義,可以返回 0 或者 1
C 語言實現
#include<stdio.h>
int invalidInput=0;
int equal(double base){
if(base-0.0>-0.0000001&&base-0.0<0.0000001){
return 1;
}else{
return 0;
}
}
double powerWithUnsignedExponent(double base,int exponent){
if(exponent==1) return base;
if(exponent==0) return 1;
double result=powerWithUnsignedExponent(base,exponent>>1);
result=result*result;
if(exponent&1==1){
result*=base;
}
return result;
}
double Power(double base,int exponent){
double result=0.0;
if(equal(base)&&exponent<0){
invalidInput=1;
return result;
}
unsigned int absExponent=(unsigned int)exponent;
if(exponent<0){
absExponent = (unsigned int)(-exponent);
}
result=powerWithUnsignedExponent(base,absExponent);
if(exponent<0){
result=1/result;
}
return result;
}
void main(){
printf("%f ",Power(2,3));
printf("%d\n",invalidInput);
printf("%f ",Power(2,-3));
printf("%d\n",invalidInput);
printf("%f ",Power(0,-3));
printf("%d\n",invalidInput);
printf("%f ",Power(0,0));
printf("%d\n",invalidInput);
}
注意事項
1 代碼完成性:功能測試、邊界測試、負面測試
2 處理錯誤的三種方法,通常有 3 種方式將錯誤信息傳遞給調用者,函數返回值,設置全局變量和拋出異常。每一種方法都有侷限,本例中使用全局變量記錄錯誤信息。
3 使用移位操作代替 *2 操作,使用 &1 代替 奇偶數判定 操作,效率會更高。
a^n = a^(n/2) * a^(n/2) n爲偶數
a^n = a^(n-1/2) * a^(n-1/2)*a n爲奇數
4 用遞歸的方式可以實現 O(lgn) 時間複雜度求解 a^n。
5 由於計算機表示小數都有誤差,不能直接使用等號判斷兩個小數是否相等,如果兩個小數的差的絕對值很小,比如小於0.0000001,就可以認爲他們相等。