1.在函数外设定全局变量,用以标识是否出错,如代码中g_InvalidInput标识运算是否有意义
好处:当标识显示没错时,可以直接使用函数的返回值(如直接传递给其他变量或作为其他函数的参数来使用)
坏处:可能忘记去检查标识的正误而留下安全隐患
2.注意指数可能为0或负数,且要考虑到底数为0时的计算(虽然0的0次方没有意义,但是考虑周全会加分,主动向面试官补充这点)
3.[提高效率的细节]位运算(位与/位或/异或/左移/右移)的效率比乘除法及求余运算的效率高很多:因此代码中用位运算代替乘除和取余.
题目描述
给定一个double类型的浮点数base和int类型的整数exponent。求base的exponent次方。
保证base和exponent不同时为0
class Solution {
public:
bool g_InvalidInput = false;
double Power(double base, int exponent) {
//设定合法判断标识
bool g_InvalidInput = false;
//底数为0,指数为负
if(equal(base, 0.0) && exponent < 0)
{
g_InvalidInput = true;
return 0.0;
}
//判断指数的正负,作为后续求幂计算后是否取倒数的依据
unsigned int absExponent = (unsigned int)(exponent);
if(exponent < 0)
absExponent = (unsigned int)(-exponent);
double result = PowerWithUnsignedExponent2(base, absExponent);
if(exponent < 0)
result = 1.0 / result;
return result;
}
//重写判断相等库函数
bool equal(double num1, double num2)
{
if((num1 - num2 > -0.000001) && (num1 - num2 < 0.000001))
return true;
return false;
}
//底数的 次幂的绝对值 计算
//常规实现,效率较低
double PowerWithUnsignedExponent1(double base, unsigned exponent)
{
double result = 1.0;
for(int i = 1; i <= exponent ; ++i)
result *= base;
return result;
}
//递归实现,效率较高
double PowerWithUnsignedExponent2(double base, unsigned exponent)
{
//递归终止条件
if(exponent == 0)
return 1;
if(exponent == 1)
return base;
double result = PowerWithUnsignedExponent2(base, exponent >> 1);
result *= result;
//如果指数为奇数,则需补乘底数
if(exponent & 0x1 == 1)
result *= base;
return result;
}
};