面試題16:數值的整數次方
阿新 • • 發佈:2018-08-09
指數 遞歸 試題 family nes style signed 類型 turn
// 面試題16:數值的整數次方
// 題目:實現函數double Power(double base, int exponent),求base的exponent
// 次方。不得使用庫函數,同時不需要考慮大數問題。
解題思路:
解題並不難,重要的是要考慮到輸入的各種情況,並且有相應的處理。
double和int都是可以取負數和0的,如果base取0,exponent<0,結果顯然是不存在的。
base取0,exponent取非負,直接返回1就可以了。
其他情況,正常運算就好,要註意如果exponent<0,應該取絕對值,完成冪次方之後再取倒數。
如果想提高代碼運行效率的話,可以使用遞歸或者循環來把a^n分解
a^n=a^(n/2)*a^(n/2),n為偶數
a^((n-1)/2)*a^((n-1)/2)*a,n為奇數
還有一點需要註意的就是,float、double類型的變量不能用==來比較,應該另外寫個函數。
c/c++:
bool g_InvalidInput = false; bool equal(double num1, double num2); double PowerWithUnsignedExponent(double base, unsigned int absExp); double Power(double base, int exponent) { //參數校驗 if (equal(base, 0.0) && exponent < 0) { g_InvalidInput = true; return 0.0; } //對指數exponent取絕對值 unsigned int absExp = (unsigned int)(exponent); if (exponent<0) absExp = (unsigned int)(-exponent); //計算pow(base,absExp) double result = PowerWithUnsignedExponent(base, absExp); //若exponent<0,取倒數 if (exponent<0) result = 1.0 / result; return result; } double PowerWithUnsignedExponent(double base, unsigned int absExp) { //遞歸中止的邊界值 if (absExp == 0) return 1; if (absExp == 1) return base; //簡化計算量 double result = 0; result = PowerWithUnsignedExponent(base, absExp >> 1); result *= result; if (absExp & 0x1 == 1) result *= base; return result; } bool equal(double num1, double num2){ //double不能直接用==比較 if ((num1 - num2 > -0.0000001) && (num1 - num2 < 0.0000001)) return true; else return false; }
參考資料:
劍指offer第二版面試題16
面試題16:數值的整數次方