题目:
给定一个double类型的浮点数base和int类型的整数exponent。求base的exponent次方。不得使用库函数,同时不需要考虑大数问题。
问题解析:
- 考察代码完整性的问题。要求有异常值的处理机制。
链接:
剑指Offer(第2版):P110
思路标签:
- 边界值处理;
- 异常值处理;
解答:
1. C++
全面但不高效的解法:
- 使用全局标志变量来标识是否有错误发生;
- 注意判断浮点数是否相等,不能简单的使用“==”来判断;
- 注意指数为负数的情况。
- 缺点是如果忘记去检查全局标识变量,就会留下安全隐患。
class Solution {
public:
double Power(double base, int exponent) {
if (equal(base, 0.0) && exponent < 0)
return 0.0;
unsigned int absExponent = (unsigned int)(exponent);
if (exponent < 0)
absExponent = (unsigned int)(-exponent);
double result = PowerWithUnsignedExponent(base, absExponent);
if (exponent < 0)
result = 1.0 / result;
return result;
}
double PowerWithUnsignedExponent(double base, unsigned int exponent) {
double result = 1.0;
for (int i = 1; i <= exponent; ++i)
result *= base;
return result;
}
bool equal(double num1, double num2)
{
if ((num1 - num2 > -0.0000001) && (num1 - num2 < 0.0000001))
return true;
else
return false;
}
};
全面且高效的解法:
- 对于指数的求法,我们可以知道求a的n次方:
- 如果n为偶数:a^n = a^(n/2) * a^(n/2);
- 如果n为奇数:a^n = a^((n-1)/2) * a^((n-1)/2) * a;
- 所以,对核心函数进行优化。
double PowerWithUnsignedExponent(double base, unsigned int exponent) {
if(exponent == 0) return 1;
if(exponent == 1) return base;
double result = PowerWithUnsignedExponent(base, exponent >> 1);
result *= result;
if(exponent & 1 == 1)
result *= base;
return result;
}