問題要求
實現函數double Power(double base,int exponent),求base的exponent次方。不得使用庫函數,同時不需要靠考慮大數問題。
問題分析
看到這個問題,我覺得我跟大多數人想的是一樣,直接循環作乘法。但是仔細一想,考慮的還是太少了。從底數和指數兩方面分別考慮:
有這麼幾種情況我們不容忽視,1)對0求倒數出現異常,要做特殊處理;2)0的0次方是沒有任何意義的,需要做特殊處理;3)複次冪即將指數求絕對值,然後再將最後的結果取倒數即可。
仔細閱讀題目就會發現,題目要求底數類型是double型的,那麼在判斷底數是不是等於0時,不能直接判斷base == 0.(計算機在表示小數時都有誤差)。判斷兩個小數是否相等,只能判斷它們之差的絕對值是不是在一個很小的範圍中。所以將該判斷方法封裝成一個函數即可 bool equal(double x,double y);
代碼如下:
//全局變量用來標識出錯是因爲底數爲0且指數爲負數的情況
bool InvaildeInput = false;
//判斷兩個小數是否相等
bool equal(double x,double y)
{
if ((x - y > -0.0000001) && (x - y < 0.0000001))
return true;
else
return false;
}
//計算指數爲正整數時的整數次方
double PowerUnsignedExponent(double base,unsigned int exponent)
{
double result = 1.0;
for(unsigned int i = 1; i <= exponent; i++)
{
result *= base;
}
return result;
}
double Power(double base,int exponent)
{
InvaildeInput = false;
if (equal(base,0.0) && exponent < 0)
{
InvaildeInput = true;
return 0.0;
}
unsigned int UnsignedExponent = (unsigned int)exponent;
if (exponent < 0)
{
UnsignedExponent = (unsigned int)(-exponent);
}
double result = PowerUnsignedExponent(base,UnsignedExponent);
if (exponent < 0)
{
result = 1.0 / result;
}
return result;
}
問題總結
在此基礎上,還有使用位運算來優化該算法的方法。這裏並沒有討論,還是想說要多思考,多寫。