剑指Offer--面试题11 数值的整数次方
原书位置:P90;
题目:实现函数double Power(double base,int exponent),求base的exponent次方。不得使用库函数,同时不需要考虑大数问题。
C++实现:
/*
题11:数值的整数次方
要求:实现函数double Power(double base,int exponent),求base的exponent次方。不得使用库函数,同时不需要考虑大数问题。
*/
#include <iostream>
using namespace std;
bool Equals(double fir, double sec)
{
if ((fir - sec) <= 0.000000001 && (fir - sec) >= -0.000000001)
{
return true;
}
else
{
return false;
}
}
double _GetPower(double base, unsigned int absExponent)
{
if (absExponent == 1) // 递归终止条件
{
return base;
}
else if (absExponent == 0) // 参数非0判断(只第一次调用需要)
{
return 1;
}
double result = _GetPower(base, absExponent >> 1); // 右移1位相当于除以2
result *= result;
if (absExponent & 0x1 == 1) // 按位与 运算判断是否为奇数
{
result *= base;
}
return result;
}
double GetPower(double base, int exponent)
{
if (Equals(base, 0.0) || Equals(base, 1.0)) return base;
unsigned int absExponent = (unsigned int)exponent;
if (exponent < 0)
{
absExponent = (unsigned int)(-exponent);
}
double result = _GetPower(base, absExponent);
if (exponent < 0 && !Equals(result, 0.0))
{
result = 1 / result;
}
return result;
}
int main(int argc, char *argv[])
{
double base = 0.0;
int exponent = 0;
cin >> base >> exponent;
cout << GetPower(base, exponent) << endl;
system("pause");
return 0;
}
思考:
1、输入参数边界+异常考虑;(如:0的0次方无意义,return 0或1均可;指数为负数等)
2、简单题则考虑效率+细节优化;(如:减少循环次数;位运算的使用等)