1 // 面试题16:数值的整数次方 2 // 题目:实现函数double Power(double base, int exponent),求base的exponent 3 // 次方。不得使用库函数,同时不需要考虑大数问题。 4 5 #include <iostream> 6 #include <cmath> 7 8 bool g_InvalidInput = false; 9 bool equal(double num1, double num2); 10 double PowerWithUnsignedExponent(double base, unsigned int exponent); 11 12 double Power(double base, int exponent) 13 { 14 g_InvalidInput = false; 15 16 if (equal(base, 0.0) && exponent < 0) 17 { 18 g_InvalidInput = true; 19 return 0.0; 20 } 21 22 unsigned int absExponent = (unsigned int) (exponent); 23 if (exponent < 0) 24 absExponent = (unsigned int) (-exponent); 25 26 double result = PowerWithUnsignedExponent(base, absExponent); 27 if (exponent < 0) 28 result = 1.0 / result; 29 30 return result; 31 } 32 33 /* 34 double PowerWithUnsignedExponent(double base, unsigned int exponent) 35 { 36 double result = 1.0; 37 38 for (int i = 1; i <= exponent; ++i) 39 result *= base; 40 return result; 41 } 42 */ 43 44 double PowerWithUnsignedExponent(double base, unsigned int exponent) 45 { 46 if (exponent == 0) 47 return 1; 48 if (exponent == 1) 49 return base; 50 51 double result = PowerWithUnsignedExponent(base, exponent >> 1); 52 result *= result; 53 if ((exponent & 0x1) == 1) 54 result *= base; 55 56 return result; 57 } 58 59 bool equal(double num1, double num2) 60 { 61 if ((num1 - num2 > -0.0000001) && (num1 - num2 < 0.0000001)) 62 return true; 63 else 64 return false; 65 } 66 67 // ====================测试代码==================== 68 void Test(const char* testName, double base, int exponent, double expectedResult, bool expectedFlag) 69 { 70 double result = Power(base, exponent); 71 if (equal(result, expectedResult) && g_InvalidInput == expectedFlag) 72 std::cout << testName << " passed" << std::endl; 73 else 74 std::cout << testName << " FAILED" << std::endl; 75 } 76 77 int main(int argc, char* argv[]) 78 { 79 // 底数、指数都为正数 80 Test("Test1", 2, 3, 8, false); 81 82 // 底数为负数、指数为正数 83 Test("Test2", -2, 3, -8, false); 84 85 // 指数为负数 86 Test("Test3", 2, -3, 0.125, false); 87 88 // 指数为0 89 Test("Test4", 2, 0, 1, false); 90 91 // 底数、指数都为0 92 Test("Test5", 0, 0, 1, false); 93 94 // 底数为0、指数为正数 95 Test("Test6", 0, 4, 0, false); 96 97 // 底数为0、指数为负数 98 Test("Test7", 0, -4, 0, true); 99 100 return 0; 101 }
相关文章: