《劍指offer》第十六題(數值的整數次方)
阿新 • • 發佈:2019-03-06
char 三種 錯誤處理 右移 情況下 不能 1.0 div class
// 面試題:數值的整數次方 // 題目:實現函數double Power(double base, int exponent),求base的exponent // 次方。不得使用庫函數,同時不需要考慮大數問題。 #include <iostream> #include <cmath> using namespace std; bool g_InvalidInput = false;//使用全局變量作為錯誤處理方式 bool equal(double num1, double num2); double PowerWithUnsignedExponent(doublebase, unsigned int exponent); double Power(double base, int exponent) { g_InvalidInput = false; if (equal(base, 0.0) && exponent < 0)//這個函數返回0同時改變g_InvalidInput,後面判斷為啥為0時候,這個變量會告訴我們是base=0且指數為負的錯誤 { g_InvalidInput = true; return 0.0;//第一種情況:base=0 } unsignedint absExponent = (unsigned int)(exponent); if (exponent < 0) absExponent = (unsigned int)(-exponent);//如果不再加負號,absExponent會變成exponent的補數 double result = PowerWithUnsignedExponent(base, absExponent); if (exponent < 0) result = 1.0 / result;//第二種情況:absExponent<0//第三種情況:absExponent>=0 return result; } //下面這個效率太低了 /* double PowerWithUnsignedExponent(double base, unsigned int exponent) { double result = 1.0; for (int i = 1; i <= exponent; ++i) result *= base; return result; } */ //類似之前的斐波那契函數裏一個計算方式 double PowerWithUnsignedExponent(double base, unsigned int exponent)//計算base不為0,exponent為非負數情況下的冪值 { if (exponent == 0) return 1; if (exponent == 1) return base; double result = PowerWithUnsignedExponent(base, exponent >> 1);//使用右移作為除2操作,會很快,exponent為正,所以不怕右移 result *= result; if ((exponent & 0x1) == 1)//使用與操作判斷是否是奇數,也是一種加速優化操作 result *= base; return result; } bool equal(double num1, double num2)//由於精度原因,不能用==,必須讓二者差在一個很小範圍內就算相等 { if ((num1 - num2 > -0.0000001) && (num1 - num2 < 0.0000001)) return true; else return false; } // ====================測試代碼==================== void Test(const char* testName, double base, int exponent, double expectedResult, bool expectedFlag) { double result = Power(base, exponent); if (equal(result, expectedResult) && g_InvalidInput == expectedFlag) std::cout << testName << " passed" << std::endl; else std::cout << testName << " FAILED" << std::endl; } int main(int argc, char* argv[]) { // 底數、指數都為正數 Test("Test1", 2, 3, 8, false); // 底數為負數、指數為正數 Test("Test2", -2, 3, -8, false); // 指數為負數 Test("Test3", 2, -3, 0.125, false); // 指數為0 Test("Test4", 2, 0, 1, false); // 底數、指數都為0 Test("Test5", 0, 0, 1, false); // 底數為0、指數為正數 Test("Test6", 0, 4, 0, false); // 底數為0、指數為負數 Test("Test7", 0, -4, 0, true); system("pause"); return 0; }
《劍指offer》第十六題(數值的整數次方)