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 }
View Code

相关文章:

  • 2021-10-04
  • 2021-12-20
  • 2021-09-25
  • 2022-12-23
  • 2021-06-07
  • 2021-06-10
  • 2021-09-16
猜你喜欢
  • 2021-08-01
  • 2022-01-23
  • 2022-01-26
相关资源
相似解决方案