题目11 数值的整数次方

/////////////////////////////////////////////////////////////////////////////////////
// 1. 题目11 数值的整数次方

// 1.1 没有考虑负数和0的情况!!!!
double Power(double dBase, int iExponent)
{
    double dRes = 1.0;
    for (int i = 0; i < iExponent; i++)
    {
        dRes *= dBase;
    }

    return dRes;
}

// 判断两个double是否相等
bool Equal(double lhs, double rhs)
{
    if ((lhs - rhs > -0.0000001) && (lhs - rhs < 0.0000001))
    {
        return true;
    }

    return false;
}

double PowerWithUnsignedExponent(double dBase, unsigned int uiExponent)
{
    double dResult = 1.0;
    for (unsigned int i = 1; i <= uiExponent; i++)
    {
        dResult *= dBase;
    }

    return dResult;
}

// 1.2 全面但不够高效的算法
double Power_1(double dBase, int iExponent)
{
    double dResult = 0.0;
    if (Equal(dBase, 0.0) && iExponent < 0)
    {
        return dResult;
    }

    unsigned int absExponent = (unsigned int)iExponent;
    if (iExponent < 0)
    {
        absExponent = (unsigned int)(-iExponent);
    }

    dResult = PowerWithUnsignedExponent(dBase, absExponent);
    if (iExponent < 0)
    {
        dResult = 1.0 / dResult;
    }

    return dResult;
}

// 1.3 全面且高效的解法
// eg 如果输入iExponent = 32, PowerWithUnsignedExponent中需要循环31次
// 另一种解法: (a)32 --> ((a)16)2 --> (((a)8)2)2 -> ... --> (((((a)2)2)2)2)2  --> 运行5次

double NewPowerWithUnsignedExponent(double dBase, unsigned int uiExponent)
{
    if (0 == uiExponent)
    {
        return 1.0;
    }
    else if (1 == uiExponent)
    {
        return dBase;
    }

    double dResult = NewPowerWithUnsignedExponent(dBase, uiExponent >> 1);
    dResult *= dResult;

    // 如果是基数
    if (uiExponent & 0x01)
    {
        dResult *= dBase;
    }

    return dResult;
}

double Power_2(double dBase, int iExponent)
{
    double dResult = 0.0;
    if (Equal(dBase, 0.0) && iExponent < 0)
    {
        return dResult;
    }

    unsigned int absExponent = (unsigned int)iExponent;
    if (iExponent < 0)
    {
        absExponent = (unsigned int)(-iExponent);
    }

    dResult = NewPowerWithUnsignedExponent(dBase, absExponent);
    if (iExponent < 0)
    {
        dResult = 1.0 / dResult;
    }

    return dResult;
}

void PowerTestFunc()
{
    cout << "\n\n --------------- PowerTestFunc Start -------------->" << endl;
    int aiArray[] = {-3, -2, -1, 0, 1, 2, 3, 4, 5, 6};
    int iLen = sizeof(aiArray) / sizeof(int);
    double dBase = 5;
    
    cout << "方法一: ==========================>>" << endl;
    for (int i = 0; i < iLen; i++)
    {
        printf("[%lf] 的 %d 次方: %lf\n", dBase, aiArray[i], Power(dBase, aiArray[i]));
    }

    cout << "方法二: ==========================>>" << endl;
    for (int i = 0; i < iLen; i++)
    {
        printf("[%lf] 的 %d 次方: %lf\n", dBase, aiArray[i], Power_1(dBase, aiArray[i]));
    }

    cout << "方法三: ==========================>>" << endl;
    for (int i = 0; i < iLen; i++)
    {
        printf("[%lf] 的 %d 次方: %lf\n", dBase, aiArray[i], Power_2(dBase, aiArray[i]));
    }

    cout << "\n\n --------------- PowerTestFunc End -------------->" << endl;

}


posted @ 2019-07-28 13:33  VIP丶可乐  阅读(121)  评论(0编辑  收藏  举报