目描述 

给定一个double类型的浮点数base和int类型的整数exponent。求base的exponent次方。

刚开始看见这道题觉得特别简单,然而它有好几个边界条件要考虑

1.在base = 0,exponent < 0的情况下,相当于分母为0,等价于无效输入。

2.要分别考虑exponent > 0,以及exponent < 0的情况。

3.当exponent = 0 ,也要单独说明。

 

还有一种方法,就是我们先不考虑边界条件,观察式子,发现它可以变换成下面这种形式:

然后只需要说明一下,exponent =0,1的情况就好,然后分为奇数和偶数进行讨论就可以了。

为了提高效率,用右移一位代表除2,用和1的与运算表示奇数和偶数。

下面附上完整代码。

 

#include<iostream>
using namespace std;
bool equalZero(double num1, double num2);
//方法一,全面考虑各种情况
double Power(double base, int exponent)
{
    double result = 1.0;
    if (equalZero(base, 0.0) && exponent < 0)    //底数为0,指数为负
    {
        cout << "输入无效" << endl;
        return 0;
    }
    if (equalZero(base, 0.0) && exponent == 0)    //底数为0,指数为0
        return 1;
    if (exponent == 0)    //指数为0
        return 1;
    if (exponent < 0)    //指数为负
        return Power(1.0 / base, -exponent);
    else if (exponent > 0)    //无特殊边界的正常情况
    {
        for (int i = exponent; i > 0; i--)
        {
            result *= base;
            exponent--;
        }
        return result;
    }
}
//方法2,采用递归的思想
double Power1(double base, int exponent)
{
    
    if (exponent == 0)
        return 1;
    if (exponent == 1)
        return base;
    double result = Power1(base, exponent >> 1);
    result *= result;
    if ((exponent & 1) == 1)
        result = base * result;
    return result;
}
bool equalZero(double num1, double num2)
{
    if ((num1 - num2) > -0.0000001 && ((num1 - num2) < -0.0000001))
        return true;
    else
        return false;
}
int main()
{
    //方法一,全面考虑各种情况
    cout << "2^3 = " << Power(2, -3) << endl;
    cout << "3^5 : " << Power1(3,5 ) << endl;
    system("pause");
    return 0;
}