题目:实现函数double Power(double base, int exponent)
,求 base 的 exponent 次方。不得使用库函数,同时不需要考虑大数问题。
解析:
首先想好测试案例,找出特殊情况
base 可能 正数、负数、0;exponent 可能正数、负数、0
(0,0) :无意义,返回 0 或 1 均可,应询问面试官
(0,-1):负面输入,不能对0取负数
(0,2): 0
(2,0)(-2,0):exponent == 0,返回1
(-2,2)(-2,-2):exponent < 0 时,先求 exponent 的绝对值幂结果,然后对结果取倒数
然后考虑是否能优化:发现如果求a的16次方,可以先求8次方,然后8次方平方;要求8次方,可以先求4次方,然后4次方平方,依次类推。。。(递归求解,需要考虑exponent的奇偶问题)
关键点:
1. 0 不能求负数次幂
2. double 型不能用”==”判断是否等于某值(精度问题),如果两者之差的绝对值小于一个设定的最小数,则可以认为它们是相等的。
3. 优化求幂的计算过程
#include <iostream>
using namespace std;
int g_error = 0;
double PowerWithUnsignedExponent(double base, unsigned int exponent);
bool equal(const double &d1, const double &d2);
double Power(double base, int exponent);
double abs(const double &d);
double Power(double base, int exponent)
{
if (equal(base, 0.0) && exponent < 0) {
g_error = -1;
return 0;
}
if (base == 0)
return 0;
if (exponent == 0)
return 1.0;
if (exponent > 0)
return PowerWithUnsignedExponent(base, (unsigned int)exponent);
if (exponent < 0)
return 1.0/PowerWithUnsignedExponent(base, (unsigned int)(-exponent));
}
// 递归求无符号型指数的幂
double PowerWithUnsignedExponent(double base, unsigned int exponent)
{
if (exponent == 0)
return 1.0;
if (exponent == 1)
return base;
double result = PowerWithUnsignedExponent(base, exponent>>1); // 除2操作,位操作更快
result *= result;
if (exponent & 0x01) // 判断奇偶
result *= base;
return result;
}
bool equal(const double &d1, const double &d2)
{
if (abs(d1-d2) < 0.00001)
return true;
else
return false;
}
double abs(const double &d)
{
return (d < 0) ? -d : d;
}
int main()
{
cout << Power(0, 0) << endl;
cout << Power(0, 2) << endl;
cout << Power(0, -2) << endl;
if(g_error == -1)
cout << "error -1: 对 0 取倒数" << endl;
cout << Power(-2,-2) << endl;
cout << Power(-2,2) << endl;
cout << Power(-2,3) << endl;
cout << Power(-2,0) << endl;
cout << Power(2,0) << endl;
cout << Power(2,-2) << endl;
cout << Power(2,2) << endl;
return 0;
}