面试题11:数值的整数次方
题目:实现函数double Power(double Power(double base, int exponent),求base的exponent次方。不得使用库函数,同时不需要考虑大数问题。
解法一:全面但不够高效的解法
需要注意的地方:
- 指数为负数的情况。
- 底数为0且指数为负数的情况。(无效输入)
- 底数为0且指数为0的情况。(0的0次方在数学上是没有意义的,因此无论是输出0还是1都可以,需要要面试官说清楚)
1 bool g_InvalidInput = false;//全局变量标识输入是否出错 2 double power(double base, int exponent) 3 { 4 if ( equal(base,0.0) && exponent < 0) 5 { 6 g_InvalidInput = true; 7 return 0.0; 8 } 9 if (exponent < 0) 10 return 1.0/powerWithUnsignedExponent(base, -1*exponent); 11 else 12 return powerWithUnsignedExponent(base, exponent); 13 14 } 15 //判断两个小数是否相等只能判断它们之差的绝对值是不是在一个很小的范围内。 16 bool equal(double num1, double num2) 17 { 18 if ((num1-num2 > -0.0000001) 19 && (num1-num2 < 0.0000001)) 20 return true; 21 else 22 return false; 23 } 24 double powerWithUnsignedExponent(double base, unsigned int exponent) 25 { 26 if (exponent == 0) 27 return 1; 28 if (exponent == 1) 29 return base; 30 double result = powerWithUnsignedExponent(base, exponent>>1); 31 result *= result; 32 if (exponent & 1 == 1)//exponent为奇数 33 result*=base; 34 return result; 35 }